Я пытаюсь скрыть параметр типа монады State
в новом типе, но мне сложно объединить существующий s
с g
, который будет предоставлен для evalFoo
. Я пробовал с ExistentialQuantification
, GADTs
и RankNTypes
, но, по общему признанию, очень плохо понимал, как работают эти расширения.Скрыть параметр типа монады монады
Как бы идиоматический способ Хаскелла выполнить этот взгляд? Спасибо!
{-# LANGUAGE GADTs #-}
import Control.Monad.State
import System.Random
data Foo a where
Foo :: RandomGen s => State s a -> Foo a
evalFoo :: RandomGen g => Foo a -> g -> a
evalFoo (Foo m) g = evalState m g
Цель состоит в том, чтобы добиться чего-то подобного, но может поставить любой экземпляр RandomGen
:
myRNG :: Foo Double
myRNG = Foo $ do
u <- state random
return u
Prelude> evalFoo myRNG (mkStdGen 123)
0.7804356004944119
' myRNG = Foo $ state random' – user3237465