Ich versuche, den Typ Parameter einer State
Monade in einem neuen Typ zu verstecken, aber ich habe eine harte Zeit vereinheitlichen die existent qualifizierte s
mit der g
für evalFoo
zur Verfügung gestellt werden. Ich habe versucht mit ExistentialQuantification
, GADTs
und RankNTypes
, aber haben ein zugegebenermaßen sehr schlechtes Verständnis davon, wie diese Erweiterungen funktionieren.Versteckt den Typ Parameter
Wie würde die idiomatische Haskell-Methode dieses Aussehen erreichen? Danke!
{-# 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
Das Ziel ist es, so etwas zu erreichen, aber in der Lage jede Instanz von RandomGen
zu liefern:
myRNG :: Foo Double
myRNG = Foo $ do
u <- state random
return u
Prelude> evalFoo myRNG (mkStdGen 123)
0.7804356004944119
' myRNG = Foo $ state random' – user3237465