List 如何将列表中的偶数增加三倍?
我不断得到以下错误:List 如何将列表中的偶数增加三倍?,list,haskell,List,Haskell,我不断得到以下错误: tripleEven :: [Int] -> [Int] tripleEven list = case list of [] -> [] [x:xs] | (x `mod` 2) == 0 = triple x tripleEven xs | otherwise = tripleEven xs where triple = (3*) 我想让它通过一个列表,若这个数字是
tripleEven :: [Int] -> [Int]
tripleEven list = case list of
[] -> []
[x:xs]
| (x `mod` 2) == 0 = triple x tripleEven xs
| otherwise = tripleEven xs
where triple = (3*)
我想让它通过一个列表,若这个数字是偶数,那个么它是三倍。如果是奇数,则移动到下一个数字,直到结束。我是Haskell的新手,只学习语法。如果有人能解释这里到底出了什么问题,我会很高兴的。谢谢。这里有几个问题:
[x:xs]
作为非空列表模式。但是,列表有两个数据构造函数:[]
和(x:xs)
(请注意圆括号,实际上括号并不是构造函数的一部分,它只是冒号操作符(:)
)李>
triple x tripleEven xs
,您不需要构建一个新列表:首先计算triple x
,然后Haskell打算使用该值作为函数执行函数调用奇数
,则对列表执行递归,因此不会将这些值放入结果中 parse error on input `='
Perhaps you need a 'let' in a 'do' block?
e.g. 'let x = 5' instead of 'x = 5'
|
71 | | (x `mod` 2) == 0 = triple x tripleEven xs
TripleEvent::[Int]->[Int]
三重事件[]=[]
三重数(x:xs)|偶x=(3*x):三重数xs
|否则=x:tripleEven xs
但这里您基本上执行了一个映射:您可以对列表中的每个元素调用该函数,因此我们可以使用以下函数构造一个特殊的映射函数:
tripleEven :: [Int] -> [Int]
tripleEven [] = []
tripleEven (x:xs) | even x = (3*x) : tripleEven xs
| otherwise = x : tripleEven xs
TripleEvent::[Int]->[Int]
tripleEven=map f
其中f x |偶数x=3*x
|否则=x
这里有一种递归的方法来编写函数,我刚刚修复了我在代码中注意到的错误
tripleEven :: [Int] -> [Int]
tripleEven = map f
where f x | even x = 3 * x
| otherwise = x
TripleEven
也可以被视为map
&filter
操作或列表理解
tripleEven :: [Int] -> [Int]
tripleEven [] -> []
tripleEven (x: xs) = case mod x 2 of
0 -> (3*x) : tripleEven xs
_ -> tripleEven xs
tripleEven [1,2,3,4]
# outputs
[6, 12]
列表类型是函子,也是单子。因此,我认为正确的方法是在列表上使用
fmap::Functor f=>(a->b)->fa->fb
。但是,仅对于列表类型,我们已经有了与fmap
完全相同的map:(a->b)->[a]->[b]
函数
所以,
这项工作应该做得很完美,而且已经提到过了
我们也可以从一元的角度来处理这个任务。然后我们需要一个一元函数来运行列表元素。使我们的lambda函数成为一元函数的是返回
指令
Prelude> let trev = map (\n -> if even n then n*3 else n)
Prelude> trev [1,2,3,4]
[1,6,3,12]
我认为OP不希望从输出中删除奇数。我将“如果是奇数,则移动到下一个数字直到结束”解释为跳过奇数,但我知道如何对其进行不同的解释。您希望在输出中保留奇数吗?即
tripleEven[1,2,3,4]
be[6,12]
或[1,6,3,12]
tripleEven :: [Int] -> [Int]
tripleEven [] = []
tripleEven (x: xs) = case mod x 2 of
0 -> trip x : tripleEven xs
where trip = (*3)
_ -> tripleEven xs
Prelude> let trev = map (\n -> if even n then n*3 else n)
Prelude> trev [1,2,3,4]
[1,6,3,12]
Prelude> let trev ns = ns >>= \n -> if even n then return (n*3) else return n
Prelude> trev [1,2,3,4]
[1,6,3,12]