使用无点符号定义 `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 版本是……好吧,id
。 id
通常被视为 pointfree 构造中的基本运算符,这是一种构造更多组合器的原语。
如果您确实需要,可以从其他更复杂的运算符重建 id
,例如利用 Monad ((->) a)
实例:
id = join const
或Applicative ((->) a)
实例
id = const <*> const
(在组合逻辑中,这是 I = S K K
因为 <*>
是 S
而 const
是 K
)
不过,没有什么比 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
。这些解决方案(不包括最后一个)构建和解构性能昂贵的数据结构。无积分风格可能是一种很好的做法,但并非无处不在。
在Haskell语言函数中id
定义为组成单元:
id :: a -> a
id x = x
有没有办法使用无点表示法定义 haskell' id
函数?
我的意思是不要像这样直接引用它:
same :: a -> a
same = id
id
的 pointfree 版本是……好吧,id
。 id
通常被视为 pointfree 构造中的基本运算符,这是一种构造更多组合器的原语。
如果您确实需要,可以从其他更复杂的运算符重建 id
,例如利用 Monad ((->) a)
实例:
id = join const
或Applicative ((->) a)
实例
id = const <*> const
(在组合逻辑中,这是 I = S K K
因为 <*>
是 S
而 const
是 K
)
不过,没有什么比 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
。这些解决方案(不包括最后一个)构建和解构性能昂贵的数据结构。无积分风格可能是一种很好的做法,但并非无处不在。