我如何在有针对性的形式上写 (:)(.)?
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]
我很难理解 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]