Haskell:理解部分应用?

Ens*_*ble 3 haskell currying

我正在阅读有关应用仿函数的LYAH章节,我似乎不理解以下示例:

ghci> :t fmap (++) (Just "hey")  
fmap (++) (Just "hey") :: Maybe ([Char] -> [Char])
Run Code Online (Sandbox Code Playgroud)

但是当我看到这个:

ghci> :t (++)
(++) :: [a] -> [a] -> [a]
ghci> :t fmap
fmap :: Functor f => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

我不知道如何像(*3)(++ "本")适合的(A - > B)型,但我看不出如何[A] - > [A] - > [一]适合(a - > b)

Pet*_*lák 7

关键是->与右侧相关联,所以类似的类型a -> b -> c就是这样a -> (b -> c).所以通过设置〜和〜来[a] -> [a] -> [a]适应.您可以将函数视为返回类型结果的2个参数的函数,或者返回返回类型结果的1参数的函数.c -> dc[a]d[a] -> [a][a] -> [a] -> [a][a][a] -> [a]


Rob*_*gar 6

要意识到的是,bin a -> b不必是标量 - 它可以是一个函数.

[a] -> [a] -> [a]可以认为是[a] -> ([a] -> [a]),所以b[a] -> [a]


Wil*_*ess 5

像往常一样把东西放在一边,

fmap :: Functor f => ( a    ->      b      )   ->      f a        ->   f b
fmap                       (++)                    (Just "hey")   ::   f b
(++) ::               [c]   -> ([c] -> [c])
Run Code Online (Sandbox Code Playgroud)

所以,

a ~ [c]  ,    b ~ ([c] -> [c])  ,    f ~ Maybe  ,    a ~ [Char]  ,   c ~ Char

f b ~ Maybe b ~ Maybe ([c] -> [c]) ~  Maybe ([Char] -> [Char])
Run Code Online (Sandbox Code Playgroud)

这里不涉及任何想法.类型的统一是一个机械过程.


并回答你的具体问题(释义),"如何[c] -> [c] -> [c]匹配a -> b",这里说:

  • 在签名类型中省略括号是邪恶的(将Haskell教给新手时)
  • 在Haskell中,没有二进制函数.每个功能都是一元的.
  • 因此(正如其他已经提到的那样),类型签名中的箭头与右侧相关联.