使用无点符号定义 `id` 函数

define `id` function using point-free notation

在Haskell语言函数中id定义为组成单元:

id :: a -> a
id x = x

有没有办法使用无点表示法定义 haskell' id 函数? 我的意思是不要像这样直接引用它:

same :: a -> a
same = id

id 的 pointfree 版本是……好吧,idid 通常被视为 pointfree 构造中的基本运算符,这是一种构造更多组合器的原语。

如果您确实需要,可以从其他更复杂的运算符重建 id,例如利用 Monad ((->) a) 实例:

id = join const

Applicative ((->) a)实例

id = const <*> const

(在组合逻辑中,这是 I = S K K 因为 <*>SconstK

不过,没有什么比 id 本身更简单了。

这个问题很有趣,因为id本质上是组合下任何数学函数群的恒等式。简单的说,当你得到两个相反的函数,将它们组合起来,就得到id.

因此,这些中的任何一个都将以相同的方式以多态方式工作,尽管自然速度较慢:

id :: a -> a
----------------------------
id = snd . (0,)
id = fst . (,0)
id = (!! 0) . return
id = ($ 0) . const
id = (\(Just n) -> n) . Just

或者,我们可以将其写在一个简单的 lambda 表达式中,这是很好的做法,而且非常简单:

id = \a -> a

这些都是免分的风格,应该能满足你的问题,但不仅不免分,还相当没分。所有这些解决方案可能看起来非常有效,它们确实有效,但它们等同于id。这些解决方案(不包括最后一个)构建和解构性能昂贵的数据结构。无积分风格可能是一种很好的做法,但并非无处不在。