繁体   English   中英

Haskell:理解部分应用?

[英]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]

要认识到的一点是,在ba -> 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 ”匹配 ,这里是:

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

这很简单:-)。 让我添加一个简单的括号:

[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM