如何在有条件的形式上写(:)(。)?

时间:2018-05-26 20:26:54

标签: haskell pointfree

我很难理解haskell中函数Go to File -> Project Structures -> SDK Location -> JDK Location -> check the Option Use embedded JDK (recommended). 的作用。有人可以帮我写出有条不紊的形式,并逐步解释如何到达那里?第一步是扩展(:)(.)以便我们获得(:),但后来我被卡住了。
它应该是((.) :)类型,但这对我没有帮助,只会让我更加困惑。

2 个答案:

答案 0 :(得分:5)

(:) (.)

埃塔展开:

\x -> (:) (.) x

转换为中缀表示法:

\x -> (.) : x

即。 x必须是一个列表,我们将(.)添加到它(这是:的作用:它将一个元素添加到列表中。)

(.)是一个函数,因此x必须是函数列表。

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

,因此x必须有

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

答案 1 :(得分:2)

我们可以先将(:)数据构造函数和函数(.) :: (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

因此该函数等于((.) :):部分"缺点"我们仍然需要填写尾部,而头部是点运算符。

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

如果我们这样作为参数[],我们构造了一个单例列表(一个只包含一个元素的列表):点运算符。

相关问题