这是我的程序FYI中的一些类型定义:
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)
问题是,无论我做什么,提取都会返回["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 (x:xs)
|x==[]=["00000"]
|x==[""]=["00000"]
|x==maximumBy(compare `on` length)xs=x --thanks SOF
|otherwise = extract (xs)
error: List.maximumBy: Empty list
答案 0 :(得分:4)
当您定义具有多个模式的函数时,将按从上到下的顺序尝试它们。问题是,extract
的最顶层模式将匹配任何,因此将始终选择第一种情况。
解决方案是重新排序它们,或者将第一个模式更改为仅匹配空列表:
extract [] = ["00000"]
extract (x:xs) = ...
答案 1 :(得分:2)
您收到该错误,因为您未将列表(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"]
(这也会在=
)
otherwise
修改强>
我对我的回答不满意,或者你接受了这个答案。
我相信这是你真正追求的代码:
extract :: [Plateau] -> Plateau
extract (x:[]) = x
extract s@(x:xs) = maximumBy (compare `on` length) s
extract _ = ["00000"]
答案 2 :(得分:0)
解决方案很简单,切换提取物的情况。模式extract _
将始终匹配,
因此第二种情况永远不会被执行。
工作代码(希望如此):
--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 (x:xs)
|x==maximumBy(compare `on` length)=x --thanks SOF
|otherwise extract (xs)
extract _ = ["00000"]