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),例如Run Code Online (Sandbox Code Playgroud)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 ]
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)
完成同样的事情.
| 归档时间: |
|
| 查看次数: |
13997 次 |
| 最近记录: |