Haskell错误:非穷举模式
我正在尝试写一个函数来计算句子中的单词Haskell错误:非穷举模式,haskell,Haskell,我正在尝试写一个函数来计算句子中的单词 cwords :: String -> Int cwords "" = 0 cwords (a:b:c) |isAlpha a && (isAlpha b == False) = 1 + cwords (b:c) |otherwise = cwords (b:c) 每当我输入一个句子时,我总是听到一个错误,说“函数cwords中的非穷举模式”。空字符串可以正常工作。(我对Haskell很陌生)问题是您定义了两个子句
cwords :: String -> Int
cwords "" = 0
cwords (a:b:c)
|isAlpha a && (isAlpha b == False) = 1 + cwords (b:c)
|otherwise = cwords (b:c)
每当我输入一个句子时,我总是听到一个错误,说“函数cwords中的非穷举模式”。空字符串可以正常工作。(我对Haskell很陌生)问题是您定义了两个子句:
- 有空名单的人
cwords "" = 0
- 列表中至少包含两个元素:
cwords (a:b:c) = ...
cwords :: String -> Int
cwords "" = 0
cwords (a:b:c)
|isAlpha a && (isAlpha b == False) = 1 + cwords (b:c)
|otherwise = cwords (b:c)
致:
尽管如此,我们仍然可以改进代码:
- 我们可以使用
代替not(isAlpha b)
李>isAlpha b==False
- 如果我们知道
不是b
,那么我们不必在这里对isAlpha
执行递归,而是可以直接对(b:c)
执行递归;及c
- 我们可以将
案例重写为一个子句,该子句至少处理一个元素的列表
cwords :: String -> Int
cwords "" = 0
cwords [a] | isAlpha a = 1
cwords (a:b:c) |isAlpha a && not (isAlpha b) = 1 + cwords c
cwords (_:b) = cwords b
问题在于您定义了两个子句:
- 有空名单的人
cwords "" = 0
- 列表中至少包含两个元素:
cwords (a:b:c) = ...
cwords :: String -> Int
cwords "" = 0
cwords (a:b:c)
|isAlpha a && (isAlpha b == False) = 1 + cwords (b:c)
|otherwise = cwords (b:c)
致:
尽管如此,我们仍然可以改进代码:
- 我们可以使用
代替not(isAlpha b)
李>isAlpha b==False
- 如果我们知道
不是b
,那么我们不必在这里对isAlpha
执行递归,而是可以直接对(b:c)
执行递归;及c
- 我们可以将
案例重写为一个子句,该子句至少处理一个元素的列表
cwords :: String -> Int
cwords "" = 0
cwords [a] | isAlpha a = 1
cwords (a:b:c) |isAlpha a && not (isAlpha b) = 1 + cwords c
cwords (_:b) = cwords b
如果字符串只有一个字符呢?谢谢!你说得对。我在想isAlpha b==False覆盖了那个字符。如果字符串只有一个字符呢?谢谢!你说得对。我想isAlpha b==False涵盖了这一点。