小编Bob*_*Bob的帖子

Haskell的逆向性:从Tardis到RevState

以下程序使用由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

15
推荐指数
1
解决办法
492
查看次数

为什么IO是monad而不是comonad?

输出是有效的计算.因此将它封装成monad是有意义的.但是输入是上下文敏感的计算.因此将它封装到comonad中会更有意义.

但是在Haskell中,输入和输出都封装在IOmonad中.为什么?

io monads haskell functional-programming comonad

14
推荐指数
2
解决办法
1045
查看次数

继续使用延续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节.ContTControl.Monad.Trans.Cont

有没有一种方法来编码前向跳转而没有值继续monad的值递归?

是否有一个替代定义ContT有一个实例MonadFix (ContT r m)?Magnus Carlsson 有一份未发表的草案提出了这样的建议,但我不知道该怎么办.

monads continuations haskell functional-programming monad-transformers

13
推荐指数
1
解决办法
602
查看次数

OCaml中的反向状态monad

你如何在OCaml中实现反向状态monad?(因为它很大程度上依赖于懒惰,我想必须使用标准库中的Lazy模块).

monads ocaml haskell lazy-evaluation state-monad

9
推荐指数
1
解决办法
302
查看次数

列表 monad 不是免费的 monad,但是……

One Monad to Prove Them All的第 12 页上,写道“ [容器]的一个突出例子是列表数据类型。列表可以由列表的长度和列表中映射位置的函数来表示”。

起初我认为这个容器上的免费 monad 与列表 monad 是同构的。

但在第 12 页上,写道“列表 monad 不是自由 monad,因为列表 monad 与自由 monad 的实例不同构”。

那么上面容器上的free monad是什么呢?它与什么同构?为什么它不与列表单子同构?可以通过商使其同构吗?

monads haskell agda category-theory free-monad

9
推荐指数
1
解决办法
524
查看次数

在哈斯克尔解释Parigot的lambda-mu演算

人们可以解释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

8
推荐指数
2
解决办法
675
查看次数

单子和共子计算的定点

在 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计算单子和共子计算的固定点?

monads haskell scala comonad fixpoint-combinators

8
推荐指数
1
解决办法
317
查看次数

推广Haskell:我们可以用Cat替换Hask吗?

很棒Haskell允许我们在Hask类别中走动.但有时我觉得它太紧了.所以我有一个关于编程语言的想法,它允许我们在小类别Cat中移动,其中类别是类型,类别C和D类型的函数将是类型C-> D的函数.起初,它似乎是一个疯狂的想法,但我发现的文章由格林·温斯克尔和他的学生马里奥·何塞卡卡莫有关此类结石!然而,它仅限于Cat的一个片段.你是否认为以这种精神扩展Haskell是可能的,即,不是在Hask类别中工作,它可以在类别(或更好的,2类)Cat中工作吗?你知道任何类似于Cáccamo和Winskel的微积分吗?

http://www.brics.dk/RS/01/27/

haskell functional-programming category-theory

6
推荐指数
0
解决办法
316
查看次数

Haskell中的Bicategories

我正在尝试为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)

两个仿函数的组合应该是一个仿函数.但是,下面的实例不会被哈斯克尔接受,因为fg不在范围之内.你会如何定义fmap

instance Functor c e …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass category-theory

6
推荐指数
1
解决办法
275
查看次数

广义Newtype导出

Haskell可以MonadState sT1下面派生实例,但不是在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)

monads haskell state-monad deriving newtype

6
推荐指数
1
解决办法
2413
查看次数