yüzden son zamanlarda bu düzgün fikir geldi bir terfi veri türü bütün davaları kapsayan:sıkı ve tembel <code>State</code> trafo modülleri arasında paylaşım kod umuduyla,
{-# LANGUAGE FlexibleInstances, DataKinds, KindSignatures #-}
module State where
data Strictness = Strict | Lazy
newtype State (t :: Strictness) s a = State (s -> (s, a))
returnState :: a -> State t s a
returnState x = State $ \s -> (s, x)
instance Monad (State Lazy s) where
return = returnState
State ma >>= amb = State $ \s -> case ma s of
~(s', x) -> runState (amb x) s'
instance Monad (State Strict s) where
return = returnState
State ma >>= amb = State $ \s -> case ma s of
(s', x) -> runState (amb x) s'
get :: State t s s
get = State $ \s -> (s, s)
put :: s -> State t s()
put s = State $ \_ -> (s,())
görebilirsiniz get
ve put
o Her ikisi de herhangi bir çoğaltma olmaksızın çalışır - hem katı hem de tembel türlerde hiçbir tip sınıf örneği, hiçbir şey yoktur. Ancak, ben Strictness
hem olası örneğini kapsar rağmen ben genel olarak State t s a
bir Monad örneği yok:
-- from http://blog.melding-monads.com/2009/12/30/fun-with-the-lazy-state-monad/
pro :: State t [Bool]()
pro = do
pro
s <- get
put (True : s)
-- No instance for (Monad (State t [Bool])) arising from a do statement
aşağıdaki eserlerini ince FlexibleContexts
gerektiren olsa:
pro :: (Monad (State t [Bool])) => State t [Bool]()
-- otherwise as before
Sonra Lazy
veya Strict
numaralı telefondan t
'u çalıştırabilir ve sonucu çalıştırabilir ve beklediğim şeyi alabilir. Ama neden bu bağlamı vermek zorundayım? Bu kavramsal bir sınırlama mı yoksa pratik bir mi? Monad (State t s a)
'un neden tutulmadığına dair bir nedenim var mı, yoksa GHC'yi henüz ikna etmenin bir yolu yok mu?
(Kenara: bağlamını Monad (State t s)
kullanarak yapar değil eser.
Could not deduce (Monad (State t [Bool])) arising from a do statement
from the context (Monad (State t s))
sadece beni daha Şüphesiz eski karıştırır ikincisi bir sonucu değildir nedir?)
Bu gerçekten 'DataKinds' sınırlamasıdır. GHC'nin "DataKinds" ile bir GADT modelinin kapsamlı olduğunu ve yazım denetimi yapmayan öneriler oluşturduğunu anlatan bir şey gördüm. –