【问题标题】:Haskell school of expression fix function [duplicate]Haskell 表达学派修复函数 [重复]
【发布时间】:2017-04-03 09:25:34
【问题描述】:

所以我正在阅读 Paul Hudak 的书“The Haskell School of Expression”,并在那里进行了一项练习。

来了

假设函数 fix 被定义为

fix f = f (fix f)

fix 的主要类型是什么? 我知道的那个是b -> b -> b

但是我不明白fix的定义方式,会不会进入无限递归?

另外,remainder 函数定义为

remainder :: Integer -> Integer -> Integer
remainder a b = if a < b then a 
                else remainder (a - b) b 

使用fix 重写remainder,使其非递归。

【问题讨论】:

  • fix 的类型不是b -&gt; b -&gt; b
  • 不,是(b -&gt; b) -&gt; b
  • Haskell 使用惰性求值。 f (fix f) 首先调用外部f,而不是fix
  • 对于许多函数fix 确实会进入无限递归而不返回。然而,对于许多人来说,它不会。例如fix (const 1)fix (1:)
  • 很好,我看到它适用于 (1:) 和 (const 1)。它的 haskell 的懒惰评估 :)

标签: haskell recursion types infinite fixpoint-combinators


【解决方案1】:

首先修复的主要类型实际上是(b -&gt; b) -&gt; b(请记住,只有b -&gt; (b -&gt; b)b -&gt; b -&gt; b 相同)。

在严格的语言中,这样的定义会进入无限递归,但因为 Haskell 是惰性的,函数的参数只有在需要时才会被计算。例如你可以定义factorial

-- with recursion
factorial :: Int -> Int
factorial n = if n == 0 then 1 else n * factorial (n-1)

-- with `fix`
factorial' :: Int -> Int
factorial' = fix (\f n -> if n == 0 then 1 else n * f (n - 1))

按照相同的模式,您应该能够定义remainder

【讨论】:

    【解决方案2】:

    玩它一点给我们

    fix f         = f (fix f)                                            -- definition
    fix f     a   = f (fix f) a                                          -- eta expansion
    fix f     a b = f (fix f) a b                                        -- eta expansion
    remainder a b = if a < b then a else remainder (a - b) b             -- definition
    -- we want  remainder = fix f:                                       -- equation
    fix f     a b = if a < b then a else (fix f)   (a - b) b             -- substitution
           = (\g -> if a < b then a else g         (a - b) b) (fix f)    -- abstraction
       = fix (\g -> \a b -> if a < b then a else g (a - b) b) a b        -- abstraction
    

    因此

    remainder = 
         fix (\g     a b -> if a < b then a else g (a - b) b)            -- eta reduction
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 2011-11-16
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多