带严格参数的函数

2021-02-11 16:10

在我的教科书中,一个修正的测验问我有多少f的参数是严格的,f为:f x0 z=x==zf x y z=xMy最初的想法是,f的所有参数都被认为是严格的,因为y的求值是为了检查它

解答动态

  • 事实证明,f在第二个参数中是否严格取决于它被解析为什么类型证明:
    data ModOne=Zeroinstance Eq ModOne其中u===True——毕竟,它们都是零,对吧?instance Num ModOne——方法实现实际上并不重要rf x 0 z=x==zf x y z=x Now inghci:
    gt;f真(未定义::Int)真***异常:前奏曲未定义,以一种相关的方式,f在其第三个参数中是否严格取决于您为前两个参数选择的值。证明,再次:
    gt;f真0未定义***异常:前奏曲未定义,这个问题其实没有一个简单的答案!f在第一个参数中是绝对严格的,但是其他两个参数是有条件的一个或另一个取决于具体情况。

    • 首先,你需要一个非常精确的“严格”定义,这样才有意义。函数f是严格的iff,它将fx求值为whnf,从而使x求值为whnf。这与currying的交互有点尴尬,我将忽略一些潜在的奇怪之处。
      假设这里的类型是f::Bool-gt;Bool->;Bool你对wrt y行为的分析是正确的-计算fx y z到whnf总是需要计算y来决定选择哪个等式。因为这是决定使用哪一个方程的唯一因素,所以我们必须将x和z的分析分开。在第一个方程中,将结果评估为whnf,结果是x和z都被评估。在第二个等式中,对whnf的结果求值会导致对x的求值。
      由于x在两个分支中都求值,所以这个函数在x中是严格的。这有点有趣-它在id严格的方式中是严格的。但这仍然有效!z、 然而,情况就不同了。只有一个分支导致z被求值,所以它不是严格求值的-它只是根据需要求值。通常我们会讨论这样的情况:在构造函数后面保护求值,或者应用函数而不求值结果,但是有条件地求值就足够了。f真1未定义的计算结果为真。如果f在z中是严格的,则必须计算为undefined.

      • End

      免责声明:

      本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。