Çoğu monadic fonksiyonlar saf argümanlar alır ve monadik bir değer döndürür. Ama örneğin, aynı zamanda monadic argümanlar gerektiğini birkaç vardır:Serbest (veya daha özgür) monadlarla monadik argümanları alan eylemler nasıl kodlanır?
mplus :: (MonadPlus m) => m a -> m a -> m a
finally :: IO a -> IO b -> IO a
forkIO :: m() -> m ThreadId
-- | From Control.Monad.Parallel
forkExec :: m a -> m (m a)
Her biri farklı bir problemi getirmek gibi görünüyor ve ben kullanarak nasıl kodlamak tür eylemleri genel bir şekilde bir kavrayışa alamayan ücretsiz monad. finally
ve forkIO
sorun Her iki
monadik bağımsız değişken sonuç daha farklı bir tipte olmasıdır. Ancak ücretsiz için,
IO a
kodunun,data MyFunctor x = Finally x x x
gibi sadeceIO a -> IO a -> IO a
kodlamasını yapacak şekilde, kodlama türünün tip değişkeni ile değiştirilmeleri gerekir.From zero to cooperative threads in 33 lines of Haskell code yazar
cFork :: (Monad m) => Thread m Bool cFork = liftF (Fork False True)
uygulamak yumruk
Fork next next
kullanır ve sonra giriş ve çıkış farklı türleri vardırfork :: (Monad m) => Thread m a -> Thread m()
uygulamak için kullanır. Ama bunun bir süreçten mi yoksa sadece bu amaç için işe yarayan geçici bir fikirden mi kaynaklandığını anlamıyorum.
data F b = MZero | MPlus b b
olarak saf bir kodlama ve suggested better implementation daha karmaşıktır:>>=
dağıtmaktadırmplus
özellikle karmaşıktır. Ve ayrıca ücretsiz birMonadPlus
was removed from free'un yerel bir uygulaması. freer yılındao niye
MPlus
NonDetEff Bool
yerineNonDetEff a a
olandata NonDetEff a where MZero :: NonDetEff a MPlus :: NonDetEff Bool
ekleyerek uygulanacağı? Ve
Free
ile çalışmak için bir yolu var, nerede CoYoneda functor kullanarak dışında bir functor olmak için veri türü ihtiyacımız var?forkExec
için Nasıl devam edeceğimi bilmiyorum.
O geliyor bana Uygulama, işlevin türüne değil, semantiklerine bağlıdır. “Ama bunun bir süreçten türetilmiş olup olmadığını anlamıyorum.” “Sürecin” burada sadece alanınızı doğru bir şekilde modellemek olduğunu düşünüyorum. Örneğin, "en genel" istisna fonksiyonlarını ('throw', 'catch'?) Kodlamayı denerseniz, 'nihayet' kodlamasının daha açık olacağını düşünüyorum. 'Nihaî' türü '<* '.. ile aynıdır, dolayısıyla teorik olarak bu tür bir fonksiyonun kodlanmasının bir nedeni yoktur (belki de doğrudan değil ..). – user2407038
@ user2407038 Ne demek istediğini anlıyorum. Ancak "tüm arayüzü mekanik olarak kodlayın ve yorumlayıcının uygulama detayları konusunda endişelenmesine izin verin" yaklaşımıyla ilgileniyorum. –