![](/img/trans.png)
[英]How to multiply two elements of each pair from list of pairs - Haskell
[英]Multiply list elements by two or every element by (itself - 1)
我需要编写一个函数,它采用正整数列表。 如果列表以2开头,则每个元素必须乘以2,在其他情况下,每个整数n写入n-1次。
two :: [Int] -> [Int]
即:
two [2,1] ==> [4,2]
two [3,2,4] ==> [3,3,2,4,4,4]
multiplyEveryoneByTwo :: [Int] -> [Int]
multiplyEveryoneByTwo [] = []
multiplyEveryoneByTwo [x] = [x*2]
multiplyEveryoneByTwo (x:xs) = (x*2) : multiplyEveryoneByTwo xs
replicateEveryone :: [Int] -> [Int]
replicateEveryone [] = []
replicateEveryone [x] = replicate (x-1) x
replicateEveryone (x:xs) = (replicate (x-1) x) ++ replicateEveryone xs
two :: [Int] -> [Int]
two [x] = if x == 2 then [x*2] else replicate (x-1) x
two (x:xs)
| x == 2 = multiplyEveryoneByTwo (x:xs)
| otherwise = replicateEveryone (x:xs)
我现在卡在写:如果列表的第一个元素是2,那么递归地将每个元素乘以2.我试着用额外的函数multiplyByTwo
做但是它不起作用。 else语句是我需要复制列表中的每个元素(本身 - 1)
是不是正确的方法来传递(X:XS)到我的辅助功能在这里| x == 2 = multiplyEveryoneByTwo (x:xs)
| x == 2 = multiplyEveryoneByTwo (x:xs)
| otherwise = replicateEveryone (x:xs)
| otherwise = replicateEveryone (x:xs)
我建议将你的问题分成两个独立的功能
multiplyEveryoneByTwo :: [Int] -> [Int]
multiplyEveryoneByTwo ...
replicateEveryone :: [Int] -> [Int]
replicateEveryone ...
在对这两个功能进行测试和工作后,您可以创建组合它们的奇怪功能
weirdf [] = ...
weirdf (x:xs)
| x == 2 = multiplyEveryone (...)
|otherwise = replicateEveryone (...)
不完整的答案(因为你的问题被标记为[家庭作业]),但要小心你的功能类型。 请注意以下类型:
two :: [Int] -> [Int]
但multiplyByTwo可能有类似的类型
multiplyByTwo :: Int -> Int
因此,写入时出现输入错误
two (x:xs) = if ... then multiplyByTwo x else ...
if-then-else表达式的类型必须与返回类型2匹配。 另外,检查两个分支的类型( then和else ):它们是否返回相同类型的表达式? 如果没有,您有另一种类型错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.