2015-11-02 3 views
0

У меня возникли проблемы с работой в GHCi. Это короткий пример, который появляется в нескольких местах в Интернете.Может быть, может использоваться для дополнительных аргументов?

import Data.Maybe 

elseZero :: (Num a) => Maybe a -> a 
elseZero n = fromMaybe 0 n 

Я понимаю, что когда я загружаю это в GHCi, а затем запустить с elseZero она должна возвращать 0, так как ни один аргумент не задан.

Но я получаю сообщение об ошибке:

Non type-variable argument in the constraint: Num (Maybe a) 
(Use FlexibleContexts to permit this) 
When checking that `it' has the inferred type 
    it :: forall a. (Num a, Num (Maybe a)) => a 

Новое на все части монадических в Haskell. Спасибо за вашу помощь!

+3

Ваш вопрос проистекает из непонимания ['fromMaybe'] (http://hackage.haskell.org/package/base-4.8.1.0/docs/Data-Maybe.html#v:fromMaybe) и путаницы в отношении Подпись типа 'elseZero':' elseZero' - это функция, которая требует одного аргумента ('Maybe a'). GHCi будет жаловаться, если вы попытаетесь оценить его, не подавая ему значение типа 'Maybe a'. 'elseZero Nothing' возвращает' 0', потому что никакое значение не может быть извлечено из 'Nothing'. – Jubobs

+4

'Может быть,' не является необязательным аргументом, вы должны указать значение типа 'Maybe'', например. 'fromMaybe Nothing' или' fromMaybe (Just 3) '. – Lee

+1

Спасибо @Jubobs. Глядя на типы для конструкторов Just (a -> Maybe a) и Nothing, было очень полезно. Я надеялся использовать Maybe как способ очистки некоторого кода, задав необязательные параметры функции по умолчанию. Теперь я вижу, что это потребует использования Just или вспомогательной функции. – todkwxrtvwmzonunswam

ответ

1

elseZero 's type is (Num a) => Maybe a -> a, так что это то, что GHCi постарается show вас. Однако функции не соответствуют show, что и сообщает об этом сообщение об ошибке.

Ваше фундаментальное недоразумение похоже на то, что вы думаете, что elseZero и elseZero Nothing одинаковы. Но первая функция является функцией типа (Num a) => Maybe a -> a, которая возвращает либо значение Just, либо значение 0, а последнее - 0 типа (Num a) => a.

Смежные вопросы