2015-11-03 3 views
0

Как попросить GHCI объяснить, почему следующее:Может ли GHCI использоваться для объяснения принуждений?

*Lib> sum Nothing 
0 

Даже компилирует? Был ли какой-то Monoid? Это не подпись!

*Lib> :i Foldable 
class Foldable (t :: * -> *) where 
    ... 
    maximum :: Ord a => t a -> a 
    minimum :: Ord a => t a -> a 
    sum :: Num a => t a -> a 
    product :: Num a => t a -> a 
     -- Defined in ‘Data.Foldable’ 
instance Foldable [] -- Defined in ‘Data.Foldable’ 
instance Foldable Maybe -- Defined in ‘Data.Foldable’ 
instance Foldable (Either a) -- Defined in ‘Data.Foldable’ 
instance Foldable ((,) a) -- Defined in ‘Data.Foldable’ 
*Lib> :i Num 
class Num a where 
    (+) :: a -> a -> a 
    (-) :: a -> a -> a 
    (*) :: a -> a -> a 
    negate :: a -> a 
    abs :: a -> a 
    signum :: a -> a 
    fromInteger :: Integer -> a 
     -- Defined in ‘GHC.Num’ 
instance Num Word -- Defined in ‘GHC.Num’ 
instance Num Integer -- Defined in ‘GHC.Num’ 
instance Num Int -- Defined in ‘GHC.Num’ 
instance Num Float -- Defined in ‘GHC.Float’ 
instance Num Double -- Defined in ‘GHC.Float’ 
*Lib> sum Nothing 
0 
+0

Я не могу ответить на ваш вопрос об интроспекции, но я могу указать, что [это] (https://hackage.haskell.org/package/base-4.8.1.0/docs/src/Data.Foldable.html # строка-218) является причиной вашего базового вопроса :) – hobbs

+2

(и на самом деле выведенный вывод ': i' говорит:« Экземпляры сложенные, возможно, определены в «Data.Foldable». Это плюс проверка «ничего» на что это «Может быть» (если вы этого еще не знали) выполняет эту работу?) – hobbs

+1

Почему бы вам просто не увидеть тип 'sum', используя': t sum'. Он укажет, что у него должен быть экземпляр «Складной», и все, что у вас есть, это экземпляр 'Maybe' для' Foldable'. – Sibi

ответ

6

Вы можете использовать типизированные отверстия:

> sum (Nothing :: _) 
<interactive>:4:17: 
    Found hole `_' with type: Maybe a 
    Where: `a' is a rigid type variable bound by 
       the inferred type of it :: Num a => a at <interactive>:4:1 
    To use the inferred type, enable PartialTypeSignatures 
    Relevant bindings include it :: a (bound at <interactive>:4:1) 
    In an expression type signature: _ 
    In the first argument of `sum', namely `(Nothing :: _)' 
    In the expression: sum (Nothing :: _) 

Который говорит, что a жесткие переменная типа связан с выведенным типом it :: Num a => a, и поскольку Maybe является экземпляром Foldable (как вы уже размещен на выходе :i Foldable, хотя вы также можете видеть на выходе :i Maybe), он компилирует, полагая, что Nothing :: Num a => Maybe a, так как sum места, которые Num ограничивают его.

Так что причина, почему он компилирует что sum принимает Foldable, содержащий Num a => a значения, и Maybe является Foldable, Nothing сам по себе имеет тип Maybe a и sum помещает ограничение, которое a необходимо реализовать Num. Когда в GHCi, это значение по умолчанию равно Integer, поэтому вы видите вывод 0.

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