Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何将列表中的偶数增加三倍?_List_Haskell - Fatal编程技术网

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]