4

このコードが失敗する理由を誰か知っていますか?

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

2 に答える 2

2

私はghcが何について不平を言っているのかもわかりません。ローカルバインディングにモノモーフィック型を与えようとしているからかもしれないと思いましたがNoMonoLocalBinds、言語プラグマに追加しても何も変わりませんでした。

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

もしそれがあなたが解決しなければならない本当の問題なら: 型シグネチャを追加することは ghc を満足させます.

于 2011-10-28T08:33:05.343 に答える
0

Haskell で型ファミリを使用したことがないので、これは私の頭を悩ませています。ただし、あなたの例は実際には型ファミリも使用していないため、プラグマTypeFamiliesから言語拡張を削除するとどうなるかを見てみたいと思いました。LANGUAGE結局のところ、それは問題なくコンパイルされます! :)

したがって、それはGHCのバグである可能性が非常に高い.

そうは言っても、少し調べてみたところ、次のものがTypeFamilies有効にされて問題なくコンパイルされることに気付きました。

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

mcode :: (Expr m, Monad m) => m ()推論された型は単に ではなく であるため、これはおそらく無意味ですが、GHC はの型が何らかの方法で の型に結び付けられているmcode :: Monad m => m ()場合にのみ幸せに見えるということです。amcode

これが役立つかどうかはわかりませんが、間違いなく私の好奇心を刺激しました!

于 2011-10-28T06:07:29.350 に答える