Как использовать переменную типа в Haskell instance-where - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь использовать переменную типа в теле where экземпляра типа. Но GHC не используйте переменную типа для функций в экземпляре типа.

Я пытаюсь реализовать класс типа Bits для [a].

instance forall a. Bits a => Bits [a] where
    xor = zipWith xor
    rotateL list dis = keeped .|. overlap
    where
        overlap = tail moved ++ [head moved] 
        (keeped, moved) = unzip $ map (\n -> let rot = rotate n dis in (rot.&.mask, rot.&.filter)) list
        mask = (complement 0) `shiftL` dis -- this line
        filter = complement mask

GHC говорит:

Could not deduce (Num a) arising from the literal ‘0’

Ожидаемое:

То, что 0 ожидается как тип a, который является переменной типа, как определено в instance forall a. Bits a => Bits [a]

1 Ответ

0 голосов
/ 03 января 2019

Существуют разные способы записи "нуля" в разных контекстах.

У вас есть только ограничение Bits a, тогда один способ написать "ноль" - это zeroBits.

0 - это ноль для типов, имеющих экземпляр Num a.

...