2016-08-18 2 views
1

При использовании следующего кода, я получаю сообщение об ошибке ниже рекурсивного использование 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 

приводит к тому же сообщение об ошибке

+2

'n' in' (undefined :: n) 'не совпадает с' n', как в '(Nat n) => Nat (Succ n)'. Однако, если вы включите '-XScopedTypeVariables' (или добавьте' {- # LANGUAGE ScopedTypeVariables # -} 'в начало вашего файла), они будут одинаковыми и все будет просто отлично. – Alec

+0

конечно, спасибо за объяснение! не могли бы вы сказать это как ответ? – nicolas

ответ

6

Проблема относится к сфере переменной n. В частности, n в (undefined :: n) не совпадает с n, как в (Nat n) => Nat (Succ n). Если вы хотите изменить это, вы можете включить -XScopedTypeVariables (или добавить {-# LANGUAGE ScopedTypeVariables #-} в начало вашего файла), а затем два n s будут одинаковыми и все будет скомпилировано.