Haskell中的Map函数

Edd*_*die 4 haskell map

据我所知,Haskell中的map接受一个函数和一个List,并在创建一个应用于每个成员的函数的新列表之前将该函数应用于该列表中的每个元素.

尝试一下,这可以很好地使用非常简单的函数,(+5)所以如果我输入它可以正常工作:

map (+7) [2,8,9,3]
Run Code Online (Sandbox Code Playgroud)

我明白了:

[9,15,16,10]
Run Code Online (Sandbox Code Playgroud)

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

shiftLetter :: Char -> Int -> Char
Run Code Online (Sandbox Code Playgroud)

(使用Int移动返回的信件的距离)

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

shiftLetters :: String -> Int -> Char
shiftLetters letters shift = map shiftLetters "AKHLKHN"
Run Code Online (Sandbox Code Playgroud)

我收到错误,为什么会这样?

Hau*_*eth 11

如果检查map函数的类型,则会看到:

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

所以你需要一个带一个参数的函数,但你需要两个参数.你必须使用

shiftLetters letters shift = map (flip shiftLetter $ shift) letters
Run Code Online (Sandbox Code Playgroud)

要么

shiftLetters letters shift = map (`shiftLetter` shift) letters
Run Code Online (Sandbox Code Playgroud)

毫无意义的风格:

shiftLetters = flip $ map . flip shiftLetter
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以做`(\`shiftLetter \`shift)`而不是`(flip shiftLetter $ shift)` (2认同)
  • 类型系统不会阻止您映射多个变量的函数.(事实上​​,在'applicative'风格中它很常见.)`map shiftLetters`是一个完全有效的表达式,其类型为`String - > [(Int - > Char)]`. (2认同)

Lou*_*man 0

看起来像你想要的

shiftLetters letters shift = map (`shiftLetter` letters) "AKHLKHN"
Run Code Online (Sandbox Code Playgroud)