7

据我了解,Haskell 中的 map 接受一个函数和一个 List,并将该函数应用于该列表中的每个元素,然后再创建一个新列表,并将该函数应用于每个成员。

试一试,这适用于非常简单的功能,例如(+5),如果我键入以下内容,它可以正常工作:

map (+7) [2,8,9,3]

我得到:

[9,15,16,10]

但是,这不适用于我创建的函数。假设我创建了一个shiftLetter类型声明为的函数:

shiftLetter :: Char -> Int -> Char

(随着 Int 移动返回的字母有多远)

如果我创建一个新函数来使用多个字母并输入:

shiftLetters :: String -> Int -> Char
shiftLetters letters shift = map shiftLetters "AKHLKHN"

我收到错误,这是为什么?

4

2 回答 2

12

如果您检查map函数的类型,那么您会看到:

map :: (a -> b) -> [a] -> [b]

所以你需要一个接受一个参数的函数,而你的需要两个。你必须使用

shiftLetters letters shift = map (flip shiftLetter $ shift) letters

或者

shiftLetters letters shift = map (`shiftLetter` shift) letters

无意义的风格:

shiftLetters = flip $ map . flip shiftLetter
于 2013-10-12T22:07:35.313 回答
0

看起来你想要

shiftLetters letters shift = map (`shiftLetter` letters) "AKHLKHN"
于 2013-10-12T20:35:40.177 回答