据我所知,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"
我收到错误,为什么会这样?
答案 0 :(得分:11)
如果您检查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
答案 1 :(得分:0)
看起来你想要
shiftLetters letters shift = map (`shiftLetter` letters) "AKHLKHN"