【问题标题】:How the type `Fix` and function `fix` are same in Haskell?Haskell 中的类型 `Fix` 和函数 `fix` 是如何相同的?
【发布时间】:2020-05-14 02:04:42
【问题描述】:

我试图说服自己类型 Fix 和函数 fix 是一回事。
但我找不到他们定义之间的相关性

-- definition of fix 
fix :: (p -> p) -> p
fix f = let {x = f x} in x -- or fix f = f (fix f)
-- definition of Fix
newtype Fix f = Fix { unFix :: f (Fix f) }

构造函数Fix如何适应(x -> x) -> x的形式?

【问题讨论】:

    标签: haskell recursion fixpoint-combinators


    【解决方案1】:

    我们来看看fix的幼稚实现:

    fix f = f (fix f)
    

    对于函数f,这将创建如下内容:

    f (f (f (f (f (f (f ...
    

    Fix newtype 的作用相同,但针对类型。因此,如果我们采用 Maybe 类型,我们将要创建:

    Maybe (Maybe (Maybe (Maybe (Maybe (Maybe ...
    

    我们如何创建一个构造该类型的函数?我们可以先尝试使用类型同义词:

    --   fix f = f (fix f)
    type Fix f = f (Fix f)
    

    您应该能够看到这与上面 fix 的幼稚实现相同,只是做了一些小的改动。但这不是合法的 Haskell!

    这是出于多种原因:主要是,Haskell 不允许像上面的 Maybe 示例那样的无限类型,而且 Haskell 的类型系统是严格的,这与 fix 中所需的惰性求值相反。这就是我们需要newtype 的原因。新类型定义(与newtypedata 一起引入)允许递归,因此我们采用类型同义词并将其更改为新类型。

    type    Fix f =                f (Fix f)
    newtype Fix f =                f (Fix f)   -- change to newtype
    newtype Fix f = Fix           (f (Fix f))  -- need to have a constructor
    newtype Fix f = Fix { unFix :: f (Fix f) } -- And name the field, also
    

    【讨论】:

      【解决方案2】:

      查看类型构造函数Fix的种类:

      > :k Fix
      Fix :: (* -> *) -> *
      

      type 构造函数Fix 类似于函数fix

      data 构造函数是另一回事。根据Understanding F-Algebras 中的解释,Fix 是一个求值器:它求值f (Fix f) 类型的术语以产生Fix f 类型的值。此评估是无损;您可以使用 unFix 从结果中恢复原始值。

      【讨论】:

      • 我希望最后一段既合理又正确。
      猜你喜欢
      • 2018-02-05
      • 2017-08-13
      • 1970-01-01
      • 2020-07-19
      • 2020-02-10
      • 2015-06-05
      • 2020-08-10
      • 2015-08-16
      • 1970-01-01
      相关资源
      最近更新 更多