За да добавя към отговора на @leftaroundabout, мисля, че мога да ви предоставя някои други опции.
Първо, не трябва да правите опасни неща като това: вашата програма ще се провали. Много по-чисто е да го поддържате като Maybe Int
и да работите като такъв безопасно. С други думи, това беше проста грешка при анализиране, но правенето на непълни функции като тази може да причини много по-големи проблеми в бъдеще.
Проблемът, който сте срещнали, как мога да го направя?
Можем да направим по-добра функция, като тази:
mapMaybe :: (a -> b) -> Maybe a -> Maybe b
mapMaybe f m = case m of
Just a -> f a
Nothing -> Nothing
Което ще ви позволи да напишете:
λ> (+ 15) `mapMaybe` Just 9
Just 24
Съществува обаче функция, наречена fmap
, която „картира“ функция върху определени структури от данни, включително Maybe
:
λ> (== 32) `fmap` Just 9
Just False
и ако имате import
ed Control.Applicative
, има хубав синоним на оператора за него:
λ> show <$> Just 9
Just "9"
Ако искате да научите повече за тези структури от данни, наречени Functors, бих препоръчал да прочетете Learn- имате Haskell.
person
AJF
schedule
27.06.2015
Just
, но програмата за проверка на типа не може да го докаже. И дори тогава е по-добре изрично да съпоставитеcase mx of {Just x -> x}
точно там, където имате нужда, а не чрез помощна функция. Причината е: ако това съвпадение не е неуспешно, то ще ви даде хубаво ясно съобщение за грешка, показващо къде се е случило. Вашиятconvert
винаги ще ви дава едно и също съобщение за грешка, когато предположението е неуспешно, независимо къде го използвате. - person leftaroundabout   schedule 27.06.2015takeWhile (/= item)
? - person Lee   schedule 27.06.2015