我如何在有针对性的形式上写 (:)(.)?

How do I write (:)(.) on pointful form?

我很难理解 haskell 中的函数 (:)(.) 的作用。有人可以帮我用有针对性的形式写出来,并逐步解释如何到达那里吗?第一步是扩展 (:) 以便我们得到 ((.) :),但后来我卡住了。
它应该是 [(b->c)->(a->b)->a->c]->[(b->c)->(a->b)->a->c] 类型,但这对我没有帮助,只会让我更加困惑。

那么我们可以先将 (:) 数据构造函数和函数 (.) :: (b -> c) -> (a -> b) -> a -> c 运算符转换为 lambda 表达式:

(:) -> (\x y -> (x:y))
(.) -> (\f g t -> f (g t))

所以这意味着 (:)(.) 是以下的缩写:

(\x y -> (x:y)) (\f g t -> f (g t))

所以现在我们可以用 lambda 表达式替换 x

 \y -> (\f g t -> f (g t)) : y

所以函数等于((.) :):一个部分"cons"这里我们还需要填尾,而头部是点运算符

因此类型是与点运算符具有相同签名的函数列表[(b -> c) -> (a -> b) -> a -> c]

如果我们因此以 [] 作为参数,我们就构造了一个 单例 列表(只有一个元素的列表):点运算符。

(:) (.)

Eta-展开:

\x -> (:) (.) x

转换为中缀表示法:

\x -> (.) : x

x 必须是一个列表,我们将 (.) 添加到它的前面(这就是 : 所做的:它将一个元素添加到列表中)。

(.)是一个函数,所以x一定是一个函数列表。

(.) :: (b -> c) -> (a -> b) -> a -> c

,所以 x 必须有类型

x   :: [(b -> c) -> (a -> b) -> a -> c]