使用map用(xy)*(xy)替换列表的元素,其中y是初始元素

bla*_*ley 7 dictionary haskell list

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

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

我一直在寻找的例子在列表中每平方元素和一种理解是如何工作的,但我将如何实现(x-y)*(x-y)y为当前元素完全令我感到困惑.

squares :: [Int] -> [Int]
squares (x:xs) = x * x : squares xs
squares [] = []
Run Code Online (Sandbox Code Playgroud)

我设定的确切问题是,

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

Main> rela 2 [3,5,7]
[1,9,25]
Run Code Online (Sandbox Code Playgroud)

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

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 ]
Run Code Online (Sandbox Code Playgroud)

Wes*_*Wes 10

首先,您应该创建一个可以满足您需求的独立功能.

例如

f x y = (x-y)*(x-y)
Run Code Online (Sandbox Code Playgroud)

现在,每次在Haskell中使用多个参数创建一个函数时,它实际上都会"理解"该函数,这意味着当您将第一个参数应用于它时,您将获得一个新函数.

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

g = f 5
Run Code Online (Sandbox Code Playgroud)

表达式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]
Run Code Online (Sandbox Code Playgroud)

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

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

squareDifference x xs = map (f x) xs
Run Code Online (Sandbox Code Playgroud)

你打算做什么 squareDifference 3 [1,2,3]


bbr*_*ain 10

你了解lambda功能吗?

map (\val -> the function) xs
Run Code Online (Sandbox Code Playgroud)

是你需要的.

currying甚至更好,但不是那么简单.

编辑:

更概念化......

map迭代应用函数的列表.

map (+ 3) xs
Run Code Online (Sandbox Code Playgroud)

使用上面提到的currying技术.你还可以:

map (\x -> x + 3) xs
Run Code Online (Sandbox Code Playgroud)

完成同样的事情.