意想不到的 属性 交换函数?
An unexpected property of commutative functions?
我得出了一个令我困惑的陈述(定理?)。不知道我的逻辑对不对
Any commutative non-strict function f :: a -> a -> b
is a constant.
交换性被理解为包括底部,即 f x y
和 f 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、交换函数.
我得出了一个令我困惑的陈述(定理?)。不知道我的逻辑对不对
Any commutative non-strict function
f :: a -> a -> b
is a constant.
交换性被理解为包括底部,即 f x y
和 f 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、交换函数.