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

Haskell:使用Map应用具有多个参数的函数,haskell,Haskell,我想要这样的东西: HelpPadNumber[“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 -

我想要这样的东西:

HelpPadNumber[“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
看看那里的地图-你的问题基本上是顺序和排列

让它看起来更好 当然,这不是真正的Haskell风格,所以让我们重新排列一下您的参数(并删除一些参数):

正如您所看到的,这个版本使用了部分应用程序,我们不需要lambda表达式。在我看来,它也更漂亮

(++)不是你的朋友 查看
space1
-您所做的只是预先添加一个空格字符,但使用列表和共分类-实际上不需要:

spaces1 :: Int -> String
spaces1 0 = ""
spaces1 n = ' ' : spaces1 (n-1)
正如您所看到的,这个函数使用
(:)
来前置单个空格字符
'
,这更有效

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

进一步的简化
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 ' ' 
我认为我们可以将helper函数放入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","    "]

非常感谢。我明白了,我必须在哈斯凯尔继续我的风格!没问题-实际上只是一些相当机械的转换-只需了解类型、咖喱和部分应用程序-其余的就可以了。顺便说一句:有些人可能也会争论我的风格(有些人喜欢无点,有些人喜欢显式,…)我喜欢你的方法:从一个简单的修复开始,获得工作版本,然后优化(解释),直到你得到想要的形式。你不仅仅展示了最终的代码,你还展示了到达那里的整个路径。干得好!
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","    "]