如何将这个let/where函数转换为Haskell中的Lambda

bev*_*009 2 haskell

我究竟如何将这个let/where函数转换为Haskell中的lambda?

让声明形式:

calc x =    let ad5 x = x + 5
                sqr x = x * x
                dbl x = x * 2
            in
                ad5 . sqr . dbl $ x
Run Code Online (Sandbox Code Playgroud)

申报表格:

calc x = ad5 . sqr . dbl $ x
  where
        ad5 x = x + 5
        sqr x = x * x
        dbl x = x * 2
Run Code Online (Sandbox Code Playgroud)

Lambda形式?也许类似于Get Prog中的这个例子,其中变量首先被声明,然后在底部定义:

sumSqrOrSqrSum4 x y =   (\sumSqr sqrSum ->
                        if sumSqr > sqrSum
                        then sumSqr
                        else sqrSum) (x^2 + y^2) ((x + y)^2)
Run Code Online (Sandbox Code Playgroud)

bra*_*drn 5

这个想法是这个let表达式:

let x = y in z
Run Code Online (Sandbox Code Playgroud)

和这个lambda完全一样:

(\x -> z) y
Run Code Online (Sandbox Code Playgroud)

在哪里y被用作参数,因此受到约束x.

在您的情况下,这将导致:

calc x = (\ad5 sqr dbl -> (ad5 . sqr . dbl $ x))
         (\x -> x + 5)
         (\x -> x * x)
         (\x -> x * 2)
Run Code Online (Sandbox Code Playgroud)

当然,在这个练习之外,很少有人会这样写它:)