Более идиоматичным дизайном Haskell будет сохранение чистых функций всего .При использовании assert
вы генерируете исключение, что делает функцию частичной .Это означает, что вы больше не можете доверять типу функции.В нем утверждается, что он имеет тип [Either String Int] -> Int
, но при различных условиях произойдет сбой с исключением во время выполнения.
Полная функция либо останется в пределах монады Either
, либо, в качестве альтернативы, может быть переведена вMaybe
:
import Text.Read
scanList :: (Num a, Read a, Ord a) => [Either String a] -> Maybe a
scanList [] = Just 0
scanList (x:xs) =
case x of
Right i -> fmap (+ i) $ scanList xs
Left s ->
case readMaybe s of
Just i -> if i < 8 then fmap (+ i) $ scanList xs else Nothing
Nothing -> Nothing
Вы могли бы немного упростить код, но я решил сохранить его структурно максимально приближенным к OP.
С типом, подобным [Either String a] -> Maybe a
любой вызывающий абонент знает, что он должен обрабатывать как случаи Just
, так и Nothing
, не прибегая к чтению кода или документации по рассматриваемой функции.