以下程序使用由Tardis monad 提供的向后行进状态.
{-# LANGUAGE RecursiveDo #-}
import Control.Monad.Tardis
lastOccurrence :: Int -> Tardis [Int] () Bool
lastOccurrence x = mdo
sendPast (x : xs)
xs <- getFuture
return (not (elem x xs))
lastOccurrences :: [Int] -> Tardis [Int] () [Bool]
lastOccurrences xs = mapM lastOccurrence xs
main :: IO ()
main =
print $ flip evalTardis ([], ()) $ lastOccurrences [3,4,6,7,4,3,5,7]
Run Code Online (Sandbox Code Playgroud)
如何用反向状态 monad 替换Tardis monad?根据我的以下提议,main
永远循环而不是[False,False,True,False,True,True,True,True]
像上面的程序一样打印
.
{-# LANGUAGE RecursiveDo #-}
import Control.Monad.RevState
lastOccurrence …
Run Code Online (Sandbox Code Playgroud) monads haskell functional-programming lazy-evaluation state-monad
输出是有效的计算.因此将它封装成monad是有意义的.但是输入是上下文敏感的计算.因此将它封装到comonad中会更有意义.
但是在Haskell中,输入和输出都封装在IO
monad中.为什么?
可以使用continuation monad在程序中向后跳转:
{-# LANGUAGE RecursiveDo #-}
import Control.Monad.Fix
import Control.Monad.Trans.Cont
setjmp = callCC (\c -> return (fix c))
backward = do
l <- setjmp
-- some code to be repeated forever
l
Run Code Online (Sandbox Code Playgroud)
但是当我试图向前跳时,GHC不接受它:
forward = mdo
l
-- some dead code
l <- setjmp
return ()
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为没有为其定义MonadFix (ContT r m)
的continuation monad转换器的实例.有关详细信息,请参阅Levent Erkok论文的第5.1节.ContT
Control.Monad.Trans.Cont
有没有一种方法来编码前向跳转而没有值继续monad的值递归?
是否有一个替代定义ContT
有一个实例MonadFix (ContT r m)
?Magnus Carlsson 有一份未发表的草案提出了这样的建议,但我不知道该怎么办.
monads continuations haskell functional-programming monad-transformers
你如何在OCaml中实现反向状态monad?(因为它很大程度上依赖于懒惰,我想必须使用标准库中的Lazy模块).
在One Monad to Prove Them All的第 12 页上,写道“ [容器]的一个突出例子是列表数据类型。列表可以由列表的长度和列表中映射位置的函数来表示”。
起初我认为这个容器上的免费 monad 与列表 monad 是同构的。
但在第 12 页上,写道“列表 monad 不是自由 monad,因为列表 monad 与自由 monad 的实例不同构”。
那么上面容器上的free monad是什么呢?它与什么同构?为什么它不与列表单子同构?可以通过商使其同构吗?
人们可以解释Haskell中的lambda演算:
data Expr = Var String | Lam String Expr | App Expr Expr
data Value a = V a | F (Value a -> Value a)
interpret :: [(String, Value a)] -> Expr -> Value a
interpret env (Var x) = case lookup x env of
Nothing -> error "undefined variable"
Just v -> v
interpret env (Lam x e) = F (\v -> interpret ((x, v):env) e)
interpret env (App e1 e2) = case interpret env e1 of …
Run Code Online (Sandbox Code Playgroud) continuations interpreter haskell lambda-calculus interpretation
在 Haskell 中,给定一个 monad m
,可以mfix :: (a -> m a) -> m a
计算一元计算的定点。
对偶,给定一个 comonad w
,可以cofix :: w (w a -> a) -> a
计算 comonad 计算的定点。
现在假设我有一个程序,它同时使用 monadm
和 comonad ,它们通过monad 相对于 monad 的w
分配律相关联。distr :: w (m a) -> m (w a)
是否可以将mfix
和组合cofix
成一个类型的函数来w (w a -> m a) -> m a
计算单子和共子计算的固定点?
很棒Haskell允许我们在Hask类别中走动.但有时我觉得它太紧了.所以我有一个关于编程语言的想法,它允许我们在小类别Cat中移动,其中类别是类型,类别C和D类型的函数将是类型C-> D的函数.起初,它似乎是一个疯狂的想法,但我发现的文章由格林·温斯克尔和他的学生马里奥·何塞卡卡莫有关此类结石!然而,它仅限于Cat的一个片段.你是否认为以这种精神扩展Haskell是可能的,即,不是在Hask类别中工作,它可以在类别(或更好的,2类)Cat中工作吗?你知道任何类似于Cáccamo和Winskel的微积分吗?
我正在尝试为bicategories定义一个类型类,并使用类别,仿函数和自然转换的双类别来实例化它.
{-# LANGUAGE NoImplicitPrelude, MultiParamTypeClasses,
TypeOperators, KindSignatures, Rank2Types,
ScopedTypeVariables, FlexibleInstances, InstanceSigs #-}
Run Code Online (Sandbox Code Playgroud)
这是类别的类:
class Category (c :: * -> * -> *) where
id :: c x x
(.) ::c y z -> c x y -> c x z
Run Code Online (Sandbox Code Playgroud)
这是仿函数的类:
class Functor c d f where
fmap :: c x y -> d (f x) (f y)
Run Code Online (Sandbox Code Playgroud)
这是仿函数的组成:
newtype Comp g f t = Comp (g (f t))
Run Code Online (Sandbox Code Playgroud)
两个仿函数的组合应该是一个仿函数.但是,下面的实例不会被哈斯克尔接受,因为f
和g
不在范围之内.你会如何定义fmap
?
instance Functor c e …
Run Code Online (Sandbox Code Playgroud) Haskell可以MonadState s
在T1
下面派生实例,但不是在T2
其中是非常相似的类型.我应该以哪种方式修改代码,T2
以便MonadState s
可以自动派生实例?
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Control.Monad.Reader
import Control.Monad.State
newtype T1 r s a =
T1 { runT1 :: ReaderT r (State s) a }
deriving (Monad, MonadReader r, MonadState s)
newtype T2 r s a =
T2 { runT2 :: StateT r (State s) a }
deriving (Monad, MonadState r, MonadState s)
Run Code Online (Sandbox Code Playgroud) haskell ×10
monads ×7
state-monad ×3
comonad ×2
agda ×1
deriving ×1
free-monad ×1
interpreter ×1
io ×1
newtype ×1
ocaml ×1
scala ×1
typeclass ×1