我的程序有问题,我能够隔离问题。我设法将其简化为这个更简单的问题。可以说我有这个功能
fn:: String -> String
fn (x:xs)
| null (x:xs) = "empty"
| otherwise = "hello"
输入随机的东西会返回"hello"
,但如果我这样做了,
fn ""
我得到了非详尽的模式错误。由于 "" 假设是一个空列表,[]
它不应该与我的第一个模式匹配并返回"empty"
吗?
我的程序有问题,我能够隔离问题。我设法将其简化为这个更简单的问题。可以说我有这个功能
fn:: String -> String
fn (x:xs)
| null (x:xs) = "empty"
| otherwise = "hello"
输入随机的东西会返回"hello"
,但如果我这样做了,
fn ""
我得到了非详尽的模式错误。由于 "" 假设是一个空列表,[]
它不应该与我的第一个模式匹配并返回"empty"
吗?
Haskell 中的AString
是一个字符列表。因此,要String
匹配空列表,您需要匹配一个空列表 ( []
)。您的模式(x:xs)
将只匹配String
具有至少一个元素的列表或 s,因为它由一个元素 ( x
) 和其余元素 ( ) 组成,这些元素xs
可以是空的或非空的。
您的函数的工作版本如下所示:
fn :: String -> String
fn [] = "empty"
fn (x:xs) = "hello"
这将返回"empty"
.fn ""
你的功能
fn:: String -> String
fn (x:xs)
| null (x:xs) = "empty"
| otherwise = "hello"
最好写成:
fn :: String -> String
fn x | null x = "empty"
| otherwise = "hello"
或者
fn :: String -> String
fn "" = "empty"
fn _ = "hello"
因为null (x:xs)
肯定是错误的(总是 False)。
我更喜欢后者,因为它清楚地表明您只关心 String 类型。
这是一个有点奇怪的功能。我没有在实践中看到它。