繁体   English   中英

将元素乘以两个或每个元素乘以(本身 - 1)

[英]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匹配。 另外,检查两个分支的类型( thenelse ):它们是否返回相同类型的表达式? 如果没有,您有另一种类型错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM