Ваша ошибка возникла не из-за неправильного понимания Maybe
: подпись типа some
указывает, что он принимает пару (Int, Maybe Int)
, тогда как в вашем определении вы предоставляете ему два аргумента. Таким образом, определение должно начинаться с some (a,b)
, чтобы соответствовать сигнатуре типа.
Один из способов решить проблему (который также немного более идиоматичен и использует сопоставление с образцом):
some :: (Int, Maybe Int) -> Int
some (a, Nothing) = a
some (a, Just b) = a + b
Также стоит отметить, что, если у вас нет действительно веской причины для использования кортежа в качестве входных данных, вам, вероятно, не следует этого делать. Если бы ваша подпись была вместо some :: Int -> Maybe Int -> Int
, у вас была бы функция двух аргументов, которые могут быть каррированными . Тогда вы бы написали что-то вроде
some :: Int -> Maybe Int -> Int
some a Nothing = a
some a (Just b) = a + b
Кроме того, вы можете добавить следующее немедленное обобщение: все типы Num
аддитивны, так что вы можете также сделать
some :: (Num n) => n -> Maybe n -> n
some a Nothing = a
some a (Just b) = a + b
(Я нарушил обычную практику использования a, b, c ... для переменных типа, чтобы не путать OP, поскольку он связывает a
и b
с аргументами some
).
person
gspr
schedule
06.12.2010
Maybe a
, ответил здесь. - person Thomas M. DuBuisson   schedule 07.12.2010