У меня возникли проблемы с работой в 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. Спасибо за вашу помощь!
Ваш вопрос проистекает из непонимания ['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
'Может быть,' не является необязательным аргументом, вы должны указать значение типа 'Maybe'', например. 'fromMaybe Nothing' или' fromMaybe (Just 3) '. – Lee
Спасибо @Jubobs. Глядя на типы для конструкторов Just (a -> Maybe a) и Nothing, было очень полезно. Я надеялся использовать Maybe как способ очистки некоторого кода, задав необязательные параметры функции по умолчанию. Теперь я вижу, что это потребует использования Just или вспомогательной функции. – todkwxrtvwmzonunswam