2010-11-20 13 views
7

は、どのようにそれが類義語はどのように正確に機能しますか?

setFunFoo :: ((Foo a) => a -> IO()) -> Bar -> Bar 

にsetFunFooを型シグネチャをオフに変更する場合は、次のタイプをチェックし

{-# LANGUAGE RankNTypes #-} 
module Main where 

class Foo a where 


type FunFoo = (Foo a) => a -> IO() 

data Bar = Bar { 
    funFoo :: FunFoo 
} 

setFunFoo :: FunFoo -> Bar -> Bar 
setFunFoo action bar = bar {funFoo = action} 

それがないことを、来るのでしょうか? FunFooという同義語なしで上記のコードを表現する方法はありますか?

+3

ランクn型を使用することは確かですか?これは、タイプ同義語がどのように機能するかを尋ねる人にとって、かなり高度なトピックです。 –

答えて

7

あなたがそうのような明示的なforallを追加する必要があります:あなたは型変数aの範囲はsetFunFooの最初の引数の型に限定されるようにしたいので

setFunFoo :: (forall a. (Foo a) => a -> IO()) -> Bar -> Bar 

この理由はあります。明示的なforallがない場合、desugaredタイプは次のようになります。

setFunFoo :: forall a. ((Foo a) => a -> IO()) -> Bar -> Bar 
関連する問題