意想不到的 属性 交换函数?

An unexpected property of commutative functions?

我得出了一个令我困惑的陈述(定理?)。不知道我的逻辑对不对

Any commutative non-strict function f :: a -> a -> b is a constant.

交换性被理解为包括底部,即 f x yf y x 要么都终止,要么都不终止。

我的非正式推理如下。假设 f 是一个非严格函数。然后存在 a 使得 f a ⊥f ⊥ a 终止。如果 f 是可交换的,那么两者都应该终止。但是 f 无法仔细检查它的任何一个论点。 (如果它首先检查第一个参数,那么 f ⊥ a 必须是 ,反之亦然)。所以它一定是一个常数函数。

这个推理正确吗?

如果允许 f 同时检查两个参数,则显然失败,如果其中一个不是 ,则成功。但是在 Haskell?

中(一些合理保守的扩展)允许这样的功能吗?

智写

One could argue that

f :: Int -> Int -> [Int]
f x y = [x+y]

is commutative, non-strict, and non-constant. This relies on [ _|_ ] being distinct from _|_. If you for some reason consider this to be strict, you should more precisely define your strictness notion.

的确如此!给定任何 non-constant、交换函数 f,您可以通过将 f 的应用程序包装在一个或多个惰性构造函数中来编写 non-strict、non-constant、交换函数.