7

我有一些功课要做,而且我是 Haskell 的新手。我遇到的问题是编写一个函数,当给定一个整数x和一个整数列表时,它适用(x-y)*(x-y)于列表中的每个元素并输出新列表,y作为输入列表的每个元素。

我有一个非常粗略的想法,我将不得不使用该map功能,但我不确定如何去做。

我一直在查看对列表中的每个元素进行平方的示例,并且有点理解它是如何工作的,但是作为当前元素,我将如何实现它(x-y)*(x-y)完全y让我感到困惑。

squares :: [Int] -> [Int]
squares (x:xs) = x * x : squares xs
squares [] = []

我提出的确切问题是,

编写一个函数,它接受一个整数和一个整数列表rela作为参数。x它返回一个类似的列表,但是每个元素y都被替换为(x-y)*(x-y),例如

Main> rela 2 [3,5,7]
[1,9,25]

在阅读了一些书籍后,我设法让它工作了,但是我编写的代码错过了列表中的第一个元素。任何解释为什么?

equation1 :: Int -> Int -> Int
equation1 x y = (x-y)*(x-y)
rela :: Int -> [Int] -> [Int]
rela x [] =[]
rela x (y:ys) = [ equation1 x y | y <- ys ]
4

4 回答 4

10

你了解 lambda 函数吗?

map (\val -> the function) xs

是你需要的。

currying 更好,但没那么简单。

编辑:

更多概念...

map 向下迭代一个应用函数的列表。

map (+ 3) xs

使用上面提到的柯里化技术。您还可以:

map (\x -> x + 3) xs

完成同样的事情。

于 2012-04-14T21:53:46.350 回答
10

首先,您可能应该创建一个单独的函数来执行您想要的操作。

例如

f x y = (x-y)*(x-y)

现在,每次你在 Haskell 中创建一个带有多个参数的函数时,它实际上都会“curries”这个函数,这意味着当你应用第一个参数时你会得到一个新函数。

所以,你会通过这样做得到一个新功能

g = f 5

表达式f 5实际上是一个函数

您可以将数字应用于“g”,x 将始终为“5”

因此,如果我们想创建一个函数,它接受两个参数“x”和“y”,并应用于(x-y)*(x-y)一个列表,其中 y 是当前元素,那么我们需要做的就是以下内容:

f x y = (x-y)*(x-y)
squareDifference x = map (f x) [1,2,3,4]

您可以通过调用squareDifference 5或任何其他数字作为参数来使用它

更通用的版本也允许您传入列表

squareDifference x xs = map (f x) xs

你会这样做squareDifference 3 [1,2,3]

于 2012-04-14T19:26:01.863 回答
2

简单的例子:

rela :: Int -> [Int] -> [Int]
rela x = map (\y -> (x-y)*(x-y))

或者你可能想要任何变态?-) 这里有应用程序:

import Control.Applicative
rela :: Int -> [Int] -> [Int]
rela x = map $ (*) <$> (x-) <*> (x-)
于 2012-04-17T03:36:20.830 回答
0

你好,我猜你的意思是这样的:

Prelude> let rela n = map (\ x -> (x - n)^2)
Prelude> rela 2  [3,5,7] 
[1,9,25]
于 2016-01-09T12:11:06.220 回答