7

我应该采用以下代码:

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 函数。有任何想法吗?

4

6 回答 6

12

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

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

wherex是变量,A并且B是表达式。

于 2011-11-19T17:27:35.137 回答
8

要重用某物,您可以将其作为某物的论据。

于 2011-11-19T16:57:42.060 回答
2

我认为意图是bravit暗示的。
smartypants 遵循法律的解决方法g与 a case;)

于 2011-11-19T17:03:20.043 回答
2

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

于 2011-11-19T17:34:58.550 回答
1

使用 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))

我只是在开玩笑,对不起。

于 2011-11-19T17:47:59.750 回答
-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 个数字并返回答案。使用 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)
于 2011-11-20T00:09:57.180 回答