我正在阅读有关应用仿函数的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)?
关键是->与右侧相关联,所以类似的类型a -> b -> c就是这样a -> (b -> c).所以通过设置〜和〜来[a] -> [a] -> [a]适应.您可以将函数视为返回类型结果的2个参数的函数,或者返回返回类型结果的1参数的函数.c -> dc[a]d[a] -> [a][a] -> [a] -> [a][a][a] -> [a]
要意识到的是,bin a -> b不必是标量 - 它可以是一个函数.
[a] -> [a] -> [a]可以认为是[a] -> ([a] -> [a]),所以b是[a] -> [a]
像往常一样把东西放在一边,
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",这里说: