具有严格参数的函数

我的教科书中一个更正的测验是问我有多少个f参数是严格的,f是:

f x 0 z = x == z
f x y z = x

我最初的想法是所有f的参数都被认为是严格的,因为y正在评估它是否等于0,并且xz比较它们是否相等。然而答案是 onlyxyare strict 。

关于原因的任何线索?

回答

事实证明,f第二个参数是否为严格取决于它解析为什么类型。

这里有证据:

data ModOne = Zero
instance Eq ModOne where
    _ == _ = True -- after all, they're both Zero, right?
instance Num ModOne -- the method implementations literally don't matter

f x 0 z = x == z
f x y z = x

现在在 ghci 中:

> f True (undefined :: ModOne) True
True
> f True (undefined :: Int) True
*** Exception: Prelude.undefined

而且,以相关的方式,f第三个参数是否严格取决于您为前两个参数选择的值。再次证明:

> f True 1 undefined
True
> f True 0 undefined
*** Exception: Prelude.undefined

所以,这个问题真的没有一个简单的答案!f第一个参数绝对是严格的;但另外两个是有条件的,视情况而定。


回答

首先,您需要对“严格”有一个非常精确的定义才能使其有意义。函数f是严格的,仅当f x对 whnfx求值导致对 whnf 求值。这与柯里化的交互有点尴尬,我将忽略引入的一些潜在的奇怪之处。

假设这里的类型是f :: Bool -> Int -> Bool -> Bool您对行为的分析 wrty是正确的 - 评估f x y zwhnf 将始终需要评估y以确定选择哪个方程。由于这是决定使用哪个方程的唯一因素,我们必须将分析拆分为xz。在第一个方程中,评价结果在两个whnf结果xz被评估。在第二个等式中,将结果计算为 whnf 会导致计算x为 whnf。

由于x在两个分支中都进行了评估,因此此函数在x. 这有点有趣 - 它的严格方式id是严格的。但这仍然有效!z然而,这是一个不同的故事。只有一个分支会z被评估,所以它没有被严格评估——它只是按需评估。通常我们谈论这种情况发生在评估被保护在构造函数后面或者当一个函数被应用并且结果没有被评估时,但是有条件地评估就足够了。f True 1 undefined评估为True. 如果f是严格在z,那将不得不评估到undefined


以上是具有严格参数的函数的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>