我的函数将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)
Run Code Online (Sandbox Code Playgroud)
向正确的方向点头将受到高度赞赏!:-)
@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
Run Code Online (Sandbox Code Playgroud)
一旦你对Haskell更加熟悉,你将能够以更紧凑的形式重写标准的递归方案,例如上面的那个,利用一些更高阶的库函数.
replaceValue :: [Maybe Int] -> String
replaceValue = map (maybe '.' intToDigit)
Run Code Online (Sandbox Code Playgroud)