我应该采用以下代码:
f x y z = x^3 - g (x + g (y - g z) + g (z^2))
where g x = 2*x^2 + 10*x + 1
并在没有 where(或 let)的情况下重写它。
他们的意思是用 Lambda 函数 (\x ->...)
我正在尝试在 Haskell 上重用 Lambda 函数。有任何想法吗?
我应该采用以下代码:
f x y z = x^3 - g (x + g (y - g z) + g (z^2))
where g x = 2*x^2 + 10*x + 1
并在没有 where(或 let)的情况下重写它。
他们的意思是用 Lambda 函数 (\x ->...)
我正在尝试在 Haskell 上重用 Lambda 函数。有任何想法吗?
let
正如 bravit 所暗示的,您可以通过以下方式使用 lambda重写非递归:
let x = A in B ==> (\x -> B) A
wherex
是变量,A
并且B
是表达式。
要重用某物,您可以将其作为某物的论据。
我认为意图是bravit暗示的。
smartypants 遵循法律的解决方法g
与 a case
;)
为了扩展 hammar 和 bravit 的提示,您的解决方案将不仅需要一个 lambda,而且需要两个 - 其中一个看起来很像g
,而另一个看起来很像f
使用 lambda 演算g
是(\x -> 2*x^2 + 10*x + 1)
所以你需要用那个替换 gf 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))
我只是在开玩笑,对不起。
这个问题对我来说似乎有点好奇和有趣。所以,我试图弄清楚什么是 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 个数字并返回答案。使用 curring 我们可以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
答案是正确的。
更新:
在这些示例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)