如何在Haskell中将此let / where函数转换为Lambda

时间:2019-02-01 10:16:14

标签: 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

申报表在哪里

calc x = ad5 . sqr . dbl $ x
  where
        ad5 x = x + 5
        sqr x = x * x
        dbl x = x * 2

Lambda形式?可能类似于Get Prog中的示例,在该示例中先声明变量,然后在底部定义变量:

sumSqrOrSqrSum4 x y =   (\sumSqr sqrSum ->
                        if sumSqr > sqrSum
                        then sumSqr
                        else sqrSum) (x^2 + y^2) ((x + y)^2)

2 个答案:

答案 0 :(得分:5)

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

let x = y in z

与该lambda完全相同:

(\x -> z) y

y用作参数,并因此绑定到x

对于您而言,这将导致:

calc x = (\ad5 sqr dbl -> (ad5 . sqr . dbl $ x))
         (\x -> x + 5)
         (\x -> x * x)
         (\x -> x * 2)

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

答案 1 :(得分:1)

对lambda的最简单直接的翻译是

calc = \x -> (x*2)*(x*2) + 5

尽管显然您可以使用基本数学来简化该表达。