2015-06-04 4 views
5

В GHCi, я типаHaskell Список Список Тип ошибки

let xs = [1, 'a'] 

сразу жалуется на ошибку:

<interactive>:28:11: 
No instance for (Num Char) arising from the literal ‘1’ 
In the expression: 1 
In the expression: [1, 'a'] 
In an equation for ‘xs’: xs = [1, 'a'] 

Однако, когда я типа

let xs = [1, [1, 1]] 

Он только что прошел. И жалуется, когда я пытаюсь напечатать хз:

<interactive>:5:1: 
No instance for (Num [t0]) arising from a use of ‘it’ 
In a stmt of an interactive GHCi command: print it 

Я думаю, что Haskell является статическим языком типа поэтому любая ошибка типа должна быть поймана во время компиляции. Мне интересно, почему вышеупомянутые 2 ошибки пойманы в разное время?

ответ

8

1 - полиморфное значение типа Num a => a. Итак, в [1, [2, 3]], у нас есть [2, 3] :: Num a => [a]; поскольку все элементы списка должны иметь один и тот же тип, мы заключаем, что мы должны иметь 1 :: Num a => [a]. Это немного странно - странно думать о 1 как о типе списка, но может быть совершенно корректным, если кто-то создает достаточно странный экземпляр Num. Проверка наличия экземпляра нажата, пока вы не попытаетесь использовать экземпляр; это дает вам возможность определить экземпляр после того, как вы определили значение с помощью экземпляра. Поэтому он не жалуется, пока вы не попытаетесь сделать что-то со списком [1, [2, 3]].

Просто, чтобы проиллюстрировать, что я имею в виду, можно написать:

instance Num a => Num [a] where 
    fromInteger n = pure (fromInteger n) 
    (+) = liftA2 (+) 
    (-) = liftA2 (-) 
    (*) = liftA2 (*) 
    abs = liftA abs 
    signum = liftA signum 

(На самом деле, этот экземпляр работает для любого Applicative, а иногда даже полезно.) Тогда, в GHCI:

> let xs = [1, [1, 1]] 
> xs 
[[1],[1,1]] 

См. Ma, никаких ошибок!

+3

Почему же одни и те же рассуждения применимы к потенциальному экземпляру «Num Char»? –

+0

@ReidBarton Хороший вопрос! Я на самом деле не уверен в этом. Я бы предположил, что во время разрешения вопроса GHC отказывается отсрочить обнаружение доказательств мономорфных ограничений; но это всего лишь предположение. –

+0

Вы можете определить экземпляр «Num Char» на основе экземпляра «Enum Char». Те же рассуждения применимы, но экземпляр просто не включен здесь. –

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