Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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
Haskell:函数中的非穷举模式(简单函数)_Haskell_Non Exhaustive Patterns - Fatal编程技术网

Haskell:函数中的非穷举模式(简单函数)

Haskell:函数中的非穷举模式(简单函数),haskell,non-exhaustive-patterns,Haskell,Non Exhaustive Patterns,我不明白为什么这个函数的第一个和第三个版本会给出这个错误,而第二个定义可以正常工作 -- head and tail third :: [a] -> a third [a] = head (tail (tail[a])) -- Pattern matching third2 :: [a] -> a third2 (_:_:x:_) = x -- List indexing third3 :: [a] -> a third3 [a] = [a]!!2 提前感谢奇怪的是,第二

我不明白为什么这个函数的第一个和第三个版本会给出这个错误,而第二个定义可以正常工作

-- head and tail
third :: [a] -> a
third [a] = head (tail (tail[a]))

-- Pattern matching
third2 :: [a] -> a
third2 (_:_:x:_) = x

-- List indexing
third3 :: [a] -> a
third3 [a] = [a]!!2

提前感谢

奇怪的是,第二位没有抱怨不详尽 模式,因为
third2
将不匹配长度为0、1或2的列表。
third
third3
函数抱怨,因为
[a]
不是变量, 这是一种模式<代码>[a]将代码减到
(a:[])
,因此您可以将它们写成

third (a:[]) = head (tail (a:[]))

third3 (a:[]) = (a:[]) !! 2
这两种方法都不起作用,因为它们是单元素列表。 我怀疑你想要的是

third a = head (tail a)

third3 a = a !! 2

奇怪的是,第二个没有抱怨非详尽无遗 模式,因为
third2
将不匹配长度为0、1或2的列表。
third
third3
函数抱怨,因为
[a]
不是变量, 这是一种模式<代码>[a]将代码减到
(a:[])
,因此您可以将它们写成

third (a:[]) = head (tail (a:[]))

third3 (a:[]) = (a:[]) !! 2
这两种方法都不起作用,因为它们是单元素列表。 我怀疑你想要的是

third a = head (tail a)

third3 a = a !! 2

您需要更好地理解语法

基本上,有两个子语法:

  • 类型的语法
  • 表达式和模式的语法
  • 在类型语法中,
    [a]
    表示
    类型a的元素列表

    在表达式/模式语法中,
    [a]
    表示包含值
    a
    的单例列表。这相当于
    (a:[])
    (空列表的前缀)

    因此,您的第一个函数,例如,检查它是否获得单例列表。然后,它以单件列表的尾部的头部为尾部,这将失败

    您得到的信息是因为您没有涵盖列表的形状:即空列表和包含多个元素的列表


    当然,如果只包含3个或3个以上元素的列表,您应该会收到一条关于
    third2
    的警告。我肯定你忽略了什么

    您需要更好地理解语法

    基本上,有两个子语法:

  • 类型的语法
  • 表达式和模式的语法
  • 在类型语法中,
    [a]
    表示
    类型a的元素列表

    在表达式/模式语法中,
    [a]
    表示包含值
    a
    的单例列表。这相当于
    (a:[])
    (空列表的前缀)

    因此,您的第一个函数,例如,检查它是否获得单例列表。然后,它以单件列表的尾部的头部为尾部,这将失败

    您得到的信息是因为您没有涵盖列表的形状:即空列表和包含多个元素的列表


    当然,如果只包含3个或3个以上元素的列表,您应该会收到一条关于
    third2
    的警告。我肯定你忽略了什么

    问题似乎是第二个函数为什么不产生这样的错误,而不是这个错误意味着什么。我不相信它没有。问题似乎是第二个函数为什么不产生这样的错误,而不是这个错误意味着什么。我不相信它没有。ghc 7.4.1 with
    -Wall
    抱怨了所有三个函数。您使用的编译器是什么?ghc 7.4.1和
    -Wall
    对这三个函数都有抱怨。你用什么编译器?