2016-07-18 17 views
3

私はdata型の関数を格納したいと考えています:State Foo a -> a。おそらく、このタイプのインスタンスが作成されると、プログラムは部分的にevalStateを計算の初期状態に適用し、結果の関数をデータ構造に格納します。その後、その関数をインスタンスから取得し、Stateモナド内の1つ以上の計算を評価し、その結果を得るために使用することができる。多型関数をデータ型に格納する方法

-- This doesn't work 
data Bar = Bar { 
    -- other members here 
    runWithState :: State Foo a -> a 
} 

==> Not in scope: type variable 'a' 

私は計算の最終結果がどうなるか分からない、それは計算が作り出すものに応じて変更することができますので、私はより多くのコンクリートを作ることができません。

これでタイプチェッカーを動作させるにはどうすればよいですか? RankNTypes拡張子を持つ

+0

注:GHCを使用。拡張機能は正常です。 –

答えて

9

使用forall

{-# LANGUAGE RankNTypes #-} 

import Control.Monad.State 

type Foo = String 

data Bar = Bar { 
    -- other members here 
    runWithState :: forall a. State Foo a -> a 
} 
関連する問題