n. *_* m. 5 haskell functional-programming lazy-evaluation strictness
我得出了一个令我困惑的陈述(定理?)。我想知道我的逻辑是否合理。
任何可交换的非严格函数
f :: a -> a -> b
都是常数。
可交换了解,包括底部,即f x y
与f y x
两个都终止,或两者都不。
我的非正式推理如下。假设f
是一个非严格函数。那么存在a
这样的,要么f a ?
或f ? a
终止。如果f
是可交换的,那么两者都应该终止。但是,f
不能仔细检查它的任何一个论点。(如果它首先检查第一个参数,则f ? a
must be ?
,反之亦然)。所以它必须是一个常数函数。
这个推理正确吗?
如果f
允许同时检查两个参数并且如果其中一个不是?
. 但是在(一些相当保守的扩展)Haskell 中允许这样的函数吗?
气写道
有人可能会争辩说
Run Code Online (Sandbox Code Playgroud)f :: Int -> Int -> [Int] f x y = [x+y]
是可交换的、非严格的、非常数的。这依赖于
[ _|_ ]
与 的区别_|_
。如果您出于某种原因认为这是严格的,那么您应该更准确地定义您的严格概念。
确实,是这样的!给定任何非常量、可交换函数f
,您可以通过将 的应用程序包装在一个或多个惰性构造函数中来编写非严格、非常量、可交换函数f
。