2015-10-08 2 views
0

У меня есть следующий код haskell. Прокомментированный фрагмент работает хорошо, но я хотел сделать его немного короче, используя лямбды. К сожалению, я, похоже, не компилирую код. intToDigit возвращает символ, но для значений ниже 15. Вот что я подозревал, был причиной проблемы ..Не удалось совместить ожидаемый тип `Maybe Int -> Char 'с фактическим типом` Char'

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 
+1

Извините за мой непроверенной, очевидно, неправильно, а теперь удален ответ. Я, возможно, воздержусь от ответов на вопросы, занимаясь другими видами деятельности. – duplode

+1

Никогда не рекомендуется использовать 'fromJust', если вы можете сделать сопоставление шаблонов. Использование частичных функций должно строго соблюдаться. – chi

ответ

4

за то, что вы хотите сделать здесь вам не нужно лямбда вообще (что вызывает проблему):

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)