如何在数据类型中存储多态函数

时间:2016-07-18 02:27:15

标签: haskell polymorphism algebraic-data-types

我有一个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'

我无法更具体,因为我不知道计算的最终结果是什么,并且它可能会根据计算产生的结果而改变。

如何使类型检查器与此一起使用?

1 个答案:

答案 0 :(得分:9)

forallRankNTypes扩展名一起使用:

{-# LANGUAGE RankNTypes #-}

import Control.Monad.State

type Foo = String

data Bar = Bar {
   -- other members here
   runWithState :: forall a. State Foo a -> a
}