gpt4 book ai didi

haskell - 为什么函数组合有时需要两个 "."来组合两个函数

转载 作者:行者123 更新时间:2023-12-04 16:23:59 24 4
gpt4 key购买 nike

所以这个问题很简单,但我似乎无法理解这个概念。

要编写普通函数,只需执行以下操作:

lowerNoSpaces = filter (/= ' ') . map toLower

但是,有时这不起作用:
myConcatMap = concat . map

它给出了错误:
<interactive>:236:1: error:
* Non type-variable argument
in the constraint: Foldable ((->) [a1])
(Use FlexibleContexts to permit this)
* When checking the inferred type
concattMap :: forall a1 a2.
Foldable ((->) [a1]) =>
(a1 -> a2) -> [a2]

但是当同样的函数这样表达时:
myConcatMap = (concat .) . map

它完全按预期工作。

我知道这是有原因的,但是我已经盯着它看了一段时间,仍然不太明白为什么原来的不起作用而这个起作用。

为什么有两个“。”的?

最佳答案

这很容易从 (.) 的定义中推导出来。和 Haskell 语法知识。

你从一个更明确的 myConcatMap 定义开始。 ,即

\f -> \xs -> concat (map f xs)

根据组合运算符的定义,您可以将其写为
\f -> concat . (map f)

使用 . 重写此内容在前缀位置而不是作为中缀运算符。
\f -> (.) concat (map f)

并添加一些多余的括号,因为函数应用程序是左关联的。
\f -> ((.) concat) (map f)

使用节语法重写它以使 .又是一个中缀运算符
\f -> (concat .) (map f)

并应用 (.) 的定义再一次,使用函数 (concat .)map :
(concat .) . map

关于haskell - 为什么函数组合有时需要两个 "."来组合两个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57431487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com