2011-10-28 10 views
4

誰にもこのコードが失敗する理由は分かりますか?haskell - 奇数型の不明確な型の変数のエラーメッセージ "where"文(TypeFamilies拡張子付き)

{-# 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 

次のようにエラーが、私はHaskellでタイプ・ファミリーを使ったことがないので、さて、これは私の頭の上にややある、

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. 
+0

ここに問題はありません。 'b'が失敗した表現にどのようなタイプがあると思いますか? –

+0

@JohnL: 'b :: Exprγ=>γ整数' – mergeconflict

+0

@mergeconflict:それは完全に合理的です。私はγを関連タイプと考えていましたが、それは間違いなくあります。 –

答えて

2

どちらのghcも文句を言っていません。ローカルバインディングに単相型を指定しようとしているためだと思っていましたが、言語プラグマにNoMonoLocalBindsを追加しても何も変更されませんでした。

しかし、コードは最新のHEAD(7.3.20111026)でそのままコンパイルされ、TypeFamiliesを有効にせずにコンパイルし、バグ仮説をサポートしています。

本当の問題なら、あなたは解決しなければならない:タイプシグネチャを追加することは、ghcを幸せにする。

+0

はい、バグのようです。ヘッドでチェックしていただきありがとうございます...ビルドサイズが2 GBであるため、私はサンドボックスにチェックアウトをしません。 – gatoatigrado

0

です。しかし、あなたの例では実際にタイプファミリを使用していないので、LANGUAGEプラグマからTypeFamilies言語拡張を削除するとどうなるか分かりました。それはうまくコンパイルされます! :)

だから、GHCバグかもしれません。

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

その推論されたタイプではなく、単にmcode :: Monad m => m()より、mcode :: (Expr m, Monad m) => m()あるので、これは、おそらく無意味ですが、:言われて、私はそれに少しを突いて、次は有効TypeFamiliesと楽しそうにコンパイルすることに気づいた

私の指摘は、aのタイプがmcodeのタイプに何らかの形で結ばれているときだけGHCが幸せに見えるということです。

これが役立つのかどうかはわかりませんが、私の好奇心をはっきりと感じました。

関連する問題