【发布时间】:2019-03-29 07:27:17
【问题描述】:
我试图理解 Haskell 中以下 2 个 lambda 表达式的含义:
f = \x -> x (\y -> x y)
g = \x -> (\y -> y) x
我尝试转换它们,结果如下:
f x y = x x y
g x y = y x
这是正确的吗?我假设这两个函数的参数必须是 x 和 y,因为它们都可以在函数描述的 lambda 表达式中找到。我基本上是这样理解的:f(x) = x f(y) and f(y) = y x。对于 g,g(x) = g(y) x 和 g(y) = y。但由于我是 Haskell 的新手,我对这些类型的转换不是很有信心。如果不正确,什么是正确的转换?
【问题讨论】:
-
f x = x (x $) = x x。它没有类型、lambda 或没有 lambda。通过 eta-expansionf x y = x x y仍然没有类型。g x = id x = x。我无法理解你的推理。 -
@WillNess 它没有 Rank-1 类型但有 Rank-2 类型:
(forall a. a -> b) -> b。 -
@AaditMShah 很有趣。看起来它并不能帮助我们输入
f . (. f)。 :) -
@WillNess Lol,Y 组合器?让我试着看看我是否可以为此设计一种类型。很可能我将无法做到。 AFAIK,小欧米茄无法输入。
-
@AaditMShah 我用谷歌搜索“y 组合器是否有 Rank-2 类型”,但没有立即出现明显的“是/否”答案。当然可以用newtype来完成...
标签: haskell functional-programming