我有以下haskell代码。那篇评论出来的作品运行良好,但我想通过使用lambdas来缩短它。不幸的是我似乎没有编译代码。 intToDigit返回一个字符,但值低于15.这就是我怀疑导致问题的原因..
printSudRow :: [Maybe Int] -> String
printSudRow [] = []
--printSudRow (ro:ros) = parseMaybeToStr ro : printSudRow ros
-- where parseMaybeToStr Nothing = '.'
-- parseMaybeToStr (Just v) = intToDigit v
printSudRow (ro:ros) = (\ro ->
if (isJust ro) then intToDigit $ fromJust ro else '.') : printSudRow ros
答案 0 :(得分:4)
你想在这里做什么,根本不需要lambda(导致问题):
import Data.Maybe (isJust, fromJust)
import Data.Char (intToDigit)
printSudRow :: [Maybe Int] -> String
printSudRow [] = []
printSudRow (ro:ros) = (if (isJust ro) then intToDigit $ fromJust ro else '.') : printSudRow ros
当然,当你已经使用模式匹配时,为什么不要一直走:
printSudRow :: [Maybe Int] -> String
printSudRow [] = []
printSudRow (Just ro:ros) = intToDigit ro : printSudRow ros
printSudRow (Nothing:ros) = '.' : printSudRow ros
这样你根本不需要fromJust
,isJust
和丑陋的if
!
和maybe
(已经提到过duplode)和map
你也可以获得一个oneliner:
printSudRow :: [Maybe Int] -> String
printSudRow = map (maybe '.' intToDigit)