在Haskell中重用Lambda函数

时间:2011-11-19 16:50:42

标签: haskell lambda-calculus

我应该接受这段代码:

f x y z = x^3 - g (x + g (y - g z) + g (z^2))
 where g x = 2*x^2 + 10*x + 1

并在没有(或让)的情况下重写它。

他们的意思是用Lambda函数(\ x - > ...)

写它

我正在尝试在Haskell上重用Lambda函数。有什么想法吗?

6 个答案:

答案 0 :(得分:12)

正如bravit暗示的那样,您可以通过以下方式使用lambda重写非递归let

let x = A in B     ==>     (\x -> B) A 

其中x是变量,AB是表达式。

答案 1 :(得分:8)

要重复使用某些东西,你可以使它成为某种东西的论据。

答案 2 :(得分:2)

我认为意图是bravit暗示的。
智能手法遵循法律信函的解决方法将gcase绑定;)

答案 3 :(得分:2)

为了扩展hammar和bravit的提示,你的解决方案不仅需要一个lambda,而且需要两个 - 其中一个看起来很像g,另一个看起来很棒比如f

的后半部分

答案 4 :(得分:1)

使用lambda演算g(\x -> 2*x^2 + 10*x + 1)

所以你需要用f x y z = x^3 - g (x + g (y - g z) + g (z^2))

替换g
$> echo "f x y z = x^3 - g (x + g (y - g z) + g (z^2))" | sed -r -e 's/g/(\\x -> 2*x^2 + 10*x + 1)/g'
f x y z = x^3 - (\x -> 2*x^2 + 10*x + 1) (x + (\x -> 2*x^2 + 10*x + 1) (y - (\x -> 2*x^2 + 10*x + 1) z) + (\x -> 2*x^2 + 10*x + 1) (z^2))

我只是在开玩笑,抱歉。

答案 5 :(得分:-1)

这个问题对我来说似乎有点好奇和有趣。所以,我正在试图找出什么是lambda演算,找到答案并希望将其显示给OP(所有提示已经实际显示,扰流警报)。

首先,让我们尝试重新定义f

λ> let f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2)))
f ::
  (Integer -> Integer) -> Integer -> Integer -> Integer -> Integer

所以,我们有功能,它获得功能和3个数字并返回答案。使用限制,我们可以在此处添加g定义,例如f_new = f g

λ> let f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) (\x -> 2*x^2 + 10*x + 1)
f :: Integer -> Integer -> Integer -> Integer

我们完成了。我们来检查一下:

λ> f 0 0 0
-13

答案是对的。

<强> UPD

在这些例子中let只是一种在解释器中声明函数的方法,所以最终的答案是:

f :: Num a => a -> a -> a -> a
f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) (\x -> 2*x^2 + 10*x + 1)