2016-07-18 3 views
3

У меня есть тип data, в котором я хотел бы сохранить функцию: State Foo a -> a. Предположительно, когда экземпляр этого типа будет создан, программа частично применит evalState с начальным состоянием для вычисления и сохранит полученную функцию в структуре данных. Позже функция может быть извлечена из экземпляра и использована для оценки одного или нескольких вычислений в монаде State и получения результата.Как сохранить полиморфную функцию в типе данных

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

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

Я не могу сделать более конкретное, потому что я не знаю, что конечный результат вычислений будет, и она может меняться в зависимости от того, что производит вычисления.

Как мне сделать проверку типа с этим?

+0

Примечание: с помощью GHC. Расширения в порядке. –

ответ

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 
}