我有一个data
类型,我希望在其中存储一个函数:State Foo a -> a
。据推测,当创建此类型的实例时,程序将部分应用具有计算初始状态的evalState
并将结果函数存储在数据结构中。之后,可以从实例中检索该函数,并用于评估State
monad中的一个或多个计算并获得结果。
-- This doesn't work
data Bar = Bar {
-- other members here
runWithState :: State Foo a -> a
}
==> Not in scope: type variable 'a'
我无法更具体,因为我不知道计算的最终结果是什么,并且它可能会根据计算产生的结果而改变。
如何使类型检查器与此一起使用?
答案 0 :(得分:9)
将forall
与RankNTypes
扩展名一起使用:
{-# LANGUAGE RankNTypes #-}
import Control.Monad.State
type Foo = String
data Bar = Bar {
-- other members here
runWithState :: forall a. State Foo a -> a
}