我的函数将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 回答
模式
x:xs
仅匹配非空列表 . 守卫(x:xs) == []
永远不会成功 .你可能意味着这个:
另请注意,
... == True
与...
的结果相同 . ;-)@MathematicalOrchid已经回答了 .
我想补充一点,使用
isNothing/isJust/fromJust
使您的代码比应有的更复杂 . 此外,fromJust
一般是危险的,因为如果你将Nothing
传递给它会崩溃 - 在这里你用isJust
守卫正确地防止这种情况,但在大型程序中很容易忘记这一点 .好消息是你可以使用模式匹配来避免所有这些辅助功能:
一旦你对Haskell更加熟悉,你将能够以更紧凑的形式重写标准的递归方案,例如上面的那个,利用一些更高阶的库函数 .