我应该接受这段代码:
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函数。有什么想法吗?
答案 0 :(得分:12)
正如bravit暗示的那样,您可以通过以下方式使用lambda重写非递归let
:
let x = A in B ==> (\x -> B) A
其中x
是变量,A
和B
是表达式。
答案 1 :(得分:8)
要重复使用某些东西,你可以使它成为某种东西的论据。
答案 2 :(得分:2)
我认为意图是bravit暗示的。
智能手法遵循法律信函的解决方法将g
与case
绑定;)
答案 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))
$> 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)