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 Haskell:函数接收空列表_List_Haskell_Max - Fatal编程技术网

List Haskell:函数接收空列表

List Haskell:函数接收空列表,list,haskell,max,List,Haskell,Max,以下是我的程序中的一些类型定义供参考: type BitString -> String type Plateau -> [BitString] 我有一个函数叫做: --Extract will take a list of lists, and return the inner list of the most items. Empty list should return ["00000"] extract::[Plateau]->Plateau extract _

以下是我的程序中的一些类型定义供参考:

type BitString -> String

type Plateau -> [BitString]
我有一个函数叫做:

--Extract will take a list of lists, and return the inner list of the most items. Empty list should return ["00000"]


extract::[Plateau]->Plateau
extract _ = ["00000"]
extract (x:xs)
  |x==maximumBy(compare `on` length)xs=x  --thanks SOF
  |otherwise = extract (xs)
问题是,无论我做什么,extract都会返回
[“00000”]

以下是GHCI的一些有效输出:

>plateau graycodes
[["01000"],["01010","11010","10010"],["00101"],["01101","01001"]]
这是预期的,并且以
[Plateau]
的形式出现,因为这是字符串列表的列表

>maximumBy(compare `on` length)(plateau graycodes)
["01010","11010","10010"]

>extract (plateau graycodes)
["00000"]
在这种情况下,我肯定会使用非空的
[Plateau]
调用extract。但是函数的
\uu
部分正在返回

我也尝试过:

extract (x:xs)
  |x==[]=["00000"]
  |x==[""]=["00000"]
  |x==maximumBy(compare `on` length)xs=x  --thanks SOF
  |otherwise = extract (xs)


error: List.maximumBy: Empty list

解决方法很简单,开关位置的情况下提取。模式
提取
将始终匹配, 因此,第二个案件永远不会执行

工作代码(希望):


解决方法很简单,开关位置的情况下提取。模式
提取
将始终匹配, 因此,第二个案件永远不会执行

工作代码(希望):


当您定义具有多个模式的函数时,将按照从上到下的顺序尝试这些模式。问题在于,您的
extract
的最顶层模式将匹配任何内容,因此将始终选择第一种情况

解决方案是对它们进行重新排序,或者将第一个模式更改为仅匹配空列表:

extract []     = ["00000"]
extract (x:xs) = ...

当您定义具有多个模式的函数时,将按照从上到下的顺序尝试这些模式。问题在于,您的
extract
的最顶层模式将匹配任何内容,因此将始终选择第一种情况

解决方案是对它们进行重新排序,或者将第一个模式更改为仅匹配空列表:

extract []     = ["00000"]
extract (x:xs) = ...

您将收到该错误,因为您没有将列表
(x:xs)
传递给maximumBy:

extract :: [Plateau] -> Plateau
extract (x:xs)
    |x == maximumBy (compare `on` length) (x:xs) = x
    |otherwise = extract (xs)
extract _ = ["00000"]
或者,最好是

extract :: [Plateau] -> Plateau
extract s@(x:xs)
    |x == maximumBy (compare `on` length) s = x
    |otherwise = extract (xs)
extract _ = ["00000"]
(这也会在
之后添加所需的
=
,否则

编辑:

我不满意我的回答,也不满意你接受我的回答

我相信这就是你真正想要的代码:

extract :: [Plateau] -> Plateau
extract (x:[]) = x
extract s@(x:xs) = maximumBy (compare `on` length) s
extract _ = ["00000"]

您将收到该错误,因为您没有将列表
(x:xs)
传递给maximumBy:

extract :: [Plateau] -> Plateau
extract (x:xs)
    |x == maximumBy (compare `on` length) (x:xs) = x
    |otherwise = extract (xs)
extract _ = ["00000"]
或者,最好是

extract :: [Plateau] -> Plateau
extract s@(x:xs)
    |x == maximumBy (compare `on` length) s = x
    |otherwise = extract (xs)
extract _ = ["00000"]
(这也会在
之后添加所需的
=
,否则

编辑:

我不满意我的回答,也不满意你接受我的回答

我相信这就是你真正想要的代码:

extract :: [Plateau] -> Plateau
extract (x:[]) = x
extract s@(x:xs) = maximumBy (compare `on` length) s
extract _ = ["00000"]


Haskell按顺序尝试这些表达式。因为uu捕捉到任何东西,所以它将始终使用该定义。尝试交换这两个定义(最后一个)。第二次尝试失败,因为您试图将
[]
匹配到
(x:xs)
。这些不匹配——
[]
中没有
——因此它永远不会到达你的守卫那里。我们不检查是否
x=[]
,因为
[]
永远无法匹配
(x:xs)
。Haskell按顺序尝试表达式。因为uu捕捉到任何东西,所以它将始终使用该定义。尝试交换这两个定义(最后一个)。第二次尝试失败,因为您试图将
[]
匹配到
(x:xs)
。这些不匹配——
[]
中没有
——因此它永远不会到达你的守卫那里。我们不检查是否
x=[]
,因为
[]
永远无法匹配
(x:xs)
。在第二部分中,我没有这样做。但是我的maximumBy仍然在“空列表”上出错。看起来你没有将代码正确地复制到你的问题中。您使用的是哪个列表上的
maximumBy
xs
?@Special--k:不,你没有。模式匹配和相等性测试是不一样的。在第二部分,我不是这样做的吗。但是我的maximumBy仍然在“空列表”上出错。看起来你没有将代码正确地复制到你的问题中。您使用的是哪个列表上的
maximumBy
xs
?@Special--k:不,你没有。模式匹配和相等性测试是不同的。Corrent,这是因为我不希望它拥有所有的x:xs。然后它将永远持续下去。如果第一个x不是最大值,那么我想发送列表的尾部并再次检查。我想我的意思是,
maximumBy(比较“on”length)
部分应用。它不是一个值,而是一个单参数函数。现在我想起来了,这整个操作都是多余的,除了你的失败案例
[“00000”]
对不起,那是我的o型操作。函数确实使用xsI,我理解您的意思。我纠正了我的问题。非常感谢。我需要发送maximumBy()(x:xs),而不仅仅是(xs)。不知道确切的原因。在你的编辑中有一些我不明白的地方。但这是我自己要研究的。再次感谢你的回答。科伦特,那是因为我不希望它有所有的x:xs。然后它将永远持续下去。如果第一个x不是最大值,那么我想发送列表的尾部并再次检查。我想我的意思是,
maximumBy(比较“on”length)
部分应用。它不是一个值,而是一个单参数函数。现在我想起来了,这整个操作都是多余的,除了你的失败案例
[“00000”]
对不起,那是我的o型操作。函数确实使用xsI,我理解您的意思。我纠正了我的问题。非常感谢。我需要发送maximumBy()(x:xs),而不仅仅是(xs)。不知道确切的原因。在你的编辑中有一些我不明白的地方。但这是我自己要研究的。再次感谢你的回答。