非详尽模式错误

时间:2014-10-01 16:46:32

标签: haskell int maybe

我的函数将Maybe Int列表作为其参数。如果元素= Nothing它应该打印一个。如果元素是Just Int,它将打印该数字。 我以为我抓住了一个底座,但我认为我没有得到正确的..我得到了一个非详尽的模式错误。

replaceValue :: [Maybe Int] -> String
replaceValue (x:xs) 
    | (x:xs) == []        = []
    | isNothing x == True = '.':replaceValue xs
    | isJust x == True    = intToDigit(fromJust x):(replaceValue xs)

向正确的方向点头将受到高度赞赏! : - )

2 个答案:

答案 0 :(得分:6)

@MathematicalOrchid已经回答了。

我想补充一点,使用isNothing/isJust/fromJust会使代码更加复杂。此外,fromJust一般都很危险,因为如果你将Nothing传递给它会崩溃 - 在这里你可以通过isJust警卫正确地防止这种情况,但它很容易忘记在大型项目中。

好消息是你可以使用模式匹配来避免所有这些辅助功能:

replaceValue :: [Maybe Int] -> String
replaceValue []             = []
replaceValue (Nothing : xs) = '.' : replaceValue xs
replaceValue (Just a : xs)  = intToDigit a : replaceValue xs

一旦你对Haskell更加熟悉,你将能够以更紧凑的形式重写标准的递归方案,例如上面的那个,利用一些高阶库函数。

replaceValue :: [Maybe Int] -> String
replaceValue = map (maybe '.' intToDigit)

答案 1 :(得分:4)

模式x:xs仅匹配非空列表。警卫(x:xs) == [] 永远不会成功。

你可能意味着这个:

replaceValue [] = []
replaceValue (x:xs)
  | isNothing x = ...
  | isJust    x = ...

另请注意,... == True...的结果相同。 ; - )