При использовании следующего кода, я получаю сообщение об ошибке ниже рекурсивного использование toInt
рекурсивные экземпляры в Haskell
module Intro0 where
data Zero
data Succ n
class Nat n where
toInt :: n -> Int
instance Nat Zero where
toInt _ = 0
instance (Nat n) => Nat (Succ n) where
toInt _ = (1::Int) + toInt (undefined :: n)
Я бы воображаемой нахождение toInt тривиальна, как указана в контексте рекурсивного например, но я получаю проблему объединения
Could not deduce (Nat n0) arising from a use of ‘toInt’
from the context (Nat n)
bound by the instance declaration
at EPhantomTypes.hs:10:10-32
The type variable ‘n0’ is ambiguous
Note: there are several potential instances:
instance Nat n => Nat (Succ n)
-- Defined at EPhantomTypes.hs:10:10
instance Nat Zero
-- Defined at EPhantomTypes.hs:8:10
In the second argument of ‘(+)’, namely ‘toInt (undefined :: n)’
In the expression: (1 :: Int) + toInt (undefined :: n)
In an equation for ‘toInt’:
toInt _ = (1 :: Int) + toInt (undefined :: n)
Я не уверен, почему это так. Это выглядит тривиально, но я не уверен, что с этим делать.
Очевидно n
и n0
должны быть одинаковыми, но даже при использовании
instance forall n . (Nat n) => Nat (Succ n) where
приводит к тому же сообщение об ошибке
'n' in' (undefined :: n) 'не совпадает с' n', как в '(Nat n) => Nat (Succ n)'. Однако, если вы включите '-XScopedTypeVariables' (или добавьте' {- # LANGUAGE ScopedTypeVariables # -} 'в начало вашего файла), они будут одинаковыми и все будет просто отлично. – Alec
конечно, спасибо за объяснение! не могли бы вы сказать это как ответ? – nicolas