gpt4 book ai didi

Haskell:使用 Map 应用具有多个参数的函数

转载 作者:行者123 更新时间:2023-12-02 06:58:23 27 4
gpt4 key购买 nike

我想要这样的东西:

helpPadNumbers ["123","45","1"] 4

结果应该是:["#123","##45","###1"]而不是“#”,它应该是“”(空格)在我的方法之后,所有元素都具有相同的长度。

helpPadNumbers :: [String] -> Int -> [String]
helpPadNumbers x 0 = x
helpPadNumbers x a = map ((test1 x a) a)

test1 :: String -> Int -> String
test1 x a = (spaces1 ((a-length x))) ++ x

spaces1 :: Int -> String
spaces1 0 = ""
spaces1 n = " " ++ spaces1 (n-1)

我的问题是:如何使用 map 函数分别获取列表中的每个元素?

错误:“可能的原因:‘map’应用于太少的参数”

有没有办法解决这个问题?

最佳答案

您走在正确的轨道上 - map 确实可以满足您的需求。因此,让我们从一个工作版本开始快速回答:

helpPadNumbers :: [String] -> Int -> [String]
helpPadNumbers x 0 = x
helpPadNumbers x a = map (\ xs -> test1 xs a) x

看看那里的 map - 你的问题基本上是顺序和括号。

让它看起来更好

当然这不是真正的 Haskell 风格所以让我们稍微重新排序您的参数(并删除一些括号):

helpPadNumbers :: Int -> [String] -> [String]
helpPadNumbers 0 xs = xs
helpPadNumbers a xs = map (test1 a) xs

test1 :: Int -> String -> String
test1 a x = spaces1 (a - length x) ++ x

spaces1 :: Int -> String
spaces1 0 = ""
spaces1 n = " " ++ spaces1 (n-1)

如您所见,此版本使用了部分应用程序,我们不需要其中的 lambda 表达式。 IMO 看起来也更好

(++) 不是你的 friend

看看 space1 - 你所做的只是在前面加上一个空格字符,但使用列表和连接 - 并不是真的需要:

spaces1 :: Int -> String
spaces1 0 = ""
spaces1 n = ' ' : spaces1 (n-1)

如您所见,此代码使用 (:) 前置单个空格字符 ' ',这样性能更高。

说到 space1:已经有一个函数:replicate :

spaces1 :: Int -> String
spaces1 n = replicate n ' '

一些进一步的简化

replicate 相当宽容(负数或零没有问题)——我们真的不需要上面的 a = 0 的情况。所以我们可以进一步简化为:

helpPadNumbers :: Int -> [String] -> [String]
helpPadNumbers n xs = map (test1 n) xs

test1 :: Int -> String -> String
test1 n x = spaces1 (n - length x) ++ x

spaces1 :: Int -> String
spaces1 n = replicate n ' '

我认为我们可以将辅助函数放入 where 子句中:

helpPadNumbers :: Int -> [String] -> [String]
helpPadNumbers n = map spaces
where spaces xs = replicate (n - length xs) ' ' ++ xs
例子:

这里是最后一个版本的使用示例:

λ> helpPadNumbers 4 ["12345", "1234","123","12","1",""]
["12345","1234"," 123"," 12"," 1"," "]

关于Haskell:使用 Map 应用具有多个参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26631656/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com