![](/img/trans.png)
[英]Understanding how Haskell precedence rules work with multiple partial application
[英]Haskell: understanding partial application?
我正在阅读有关应用仿函数的LYAH章节 ,我似乎不理解以下示例:
ghci> :t fmap (++) (Just "hey")
fmap (++) (Just "hey") :: Maybe ([Char] -> [Char])
但是当我看到这个:
ghci> :t (++)
(++) :: [a] -> [a] -> [a]
ghci> :t fmap
fmap :: Functor f => (a -> b) -> f a -> f b
我确实理解(* 3)或(++“this”)类似于( a - > b)类型,但我只是看不出[a] - > [a] - > [a]适合(a - > b) ?
关键是->
右边的关联,所以像a -> b -> c
这样的类型实际上a -> (b -> c)
。 所以[a] -> [a] -> [a]
通过设置c
~ [a]
和d
~ [a] -> [a]
拟合c -> d
。 您可以查看函数[a] -> [a] -> [a]
作为返回类型[a]
的结果的2个参数的函数,或者返回类型[a] -> [a]
的结果的1个参数的函数[a] -> [a]
。
要认识到的一点是,在b
中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])
所以,
a ~ [c] , b ~ ([c] -> [c]) , f ~ Maybe , a ~ [Char] , c ~ Char
f b ~ Maybe b ~ Maybe ([c] -> [c]) ~ Maybe ([Char] -> [Char])
这里不涉及任何想法。 类型的统一是一个机械过程。
并回答你的具体问题(释义), “如何[c] -> [c] -> [c]
可以与a -> b
”匹配 ,这里是:
这很简单:-)。 让我添加一个简单的括号:
[a]->[a]->[a]
就像[a]->([a]->[a])
因此它通过将[a]
和b替换为[a]->[a]
来拟合a->b
。 你给一个字符串给++,你得到一个string->string
类型的函数作为回报
fmap (++) (Just "hey")
是一个可能的monad,它持有一个函数,该函数将字符串“hey”加到另一个字符串fmap (++) (Just "hey")
。 它确实是类型Maybe ([Char] -> [Char])
考虑Maybe类型的fmap定义。
fmap f (Just x) = Just (f x)
对于你的例子看起来像
fmap (++) (Just "Hey") = Just ("Hey" ++) :: Maybe ([Char] -> [Char])
如fmap所示,您只需在Maybe容器中解除(++)函数并将其应用于内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.