haskell - нечетное сообщение об ошибке переменной неоднозначного типа для кода в выражении "where" с расширением TypeFamilies - PullRequest
4 голосов
/ 28 октября 2011

Кто-нибудь знает, почему этот код не работает?

{-# LANGUAGE NoMonomorphismRestriction,
             TypeFamilies #-}

module Test where

asExprTyp :: Expr γ =>
    γ α
    -> α
    -> γ α
asExprTyp x _ = x

int = undefined :: Integer

class Expr γ where
    a :: γ α

-- this works fine
b = a `asExprTyp` int

-- this fails
mcode = do
    return ()
    where b = a `asExprTyp` int

Ошибка следующая,

Test.hs:23:15:
    Ambiguous type variable `γ0' in the constraint:
    (Expr γ0) arising from a use of `a'
    Probable fix: add a type signature that fixes these type variable(s)
    In the first argument of `asExprTyp', namely `a'
    In the expression: a `asExprTyp` int
    In an equation for `b': b = a `asExprTyp` int
Failed, modules loaded: none.

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Я тоже не вижу, на что жалуется GHC. Я подумал, что это может быть потому, что он пытается придать локальной привязке мономорфный тип, но добавление NoMonoLocalBinds к языковой прагме ничего не изменило.

Однако код компилируется как есть с недавним HEAD (7.3.20111026) вместе с тем фактом, что он компилируется без включенной TypeFamilies, что поддерживает гипотезу ошибки.

Если это реальная проблема, которую вам нужно решить: добавление сигнатур типов делает GHC счастливым.

0 голосов
/ 28 октября 2011

Хорошо, это немного над моей головой, так как я никогда не использовал семейства типов в Хаскеле.Однако в вашем примере на самом деле также не используются семейства типов, поэтому я подумал, что увижу, когда я уберу расширение языка TypeFamilies из прагмы LANGUAGE.Оказывается: это компилируется просто отлично!:)

Так что это вполне может быть ошибка GHC.

При этом я немного ткнул в нее и заметил, что следующие компоненты успешно компилируются с TypeFamilies:

mcode = do
            b
            return ()
        where b = a `asExprTyp` int

Это, вероятно, бессмысленно, поскольку его предполагаемый тип - mcode :: (Expr m, Monad m) => m (), а не просто mcode :: Monad m => m (), но я хочу сказать, что GHC кажется счастливым только тогда, когда тип a каким-то образом связан с *Тип 1014 *.

Не уверен, что это полезно, но это определенно пробудило мое любопытство!

...