小编Dus*_*ang的帖子

使用Operational Monad实现的Writer不会懒惰地工作

我使用Operational Monad方法编写了一个具有Writer功能的monad.然后我注意到它懒惰不起作用.

在下面的代码中,有一个rogueWriter执行无限多个语句,每个语句都写一个字符串.该程序不会终止althaugh只需要无限输出的某些字符.

经过我的分析,我发现流氓作家实际上非常友好(哈哈),因为当我改变runMyWriter rogueWriterrunWriter rogueWriter,一切顺利.

问题:

  1. 如何最好地解释这种行为?
  2. 我该如何更改代码才能使其正常工作?
  3. monad变换器SomeMonadT出现了同样的问题
    SomeMonadT Writer w.WriterT w SomeMonad (也许是一些例子?)

编辑:我有可能在这里试图扭转一个无限的字符串吗?Sjoerd Visscher的解决方案与我的解决方案之间存在显着差异

w `mappend` ws  resp.  ws `mappend` w
Run Code Online (Sandbox Code Playgroud)

码:

{-# LANGUAGE GADTs, FlexibleContexts, TypeSynonymInstances,
                    FlexibleInstances, MultiParamTypeClasses #-}

module Writer where

import Control.Monad.Identity
import Control.Monad.Operational
import Control.Monad.Writer
import Data.Monoid

data MyWriterI w a where
    Tell :: w -> MyWriterI w ()

type MyWriterT w = ProgramT (MyWriterI w)

type MyWriter w = (MyWriterT w) …
Run Code Online (Sandbox Code Playgroud)

monads haskell lazy-evaluation monad-transformers writer-monad

10
推荐指数
1
解决办法
187
查看次数

将Maybes映射到monad的功能

我经常使用表单的表达式maybe (return ()) someFunc someMaybe.

Monad m => (a -> m ()) -> Maybe a -> m ()在hoogle上搜索函数不会产生特定结果.这个没有库函数吗?

monads haskell standard-library

7
推荐指数
1
解决办法
154
查看次数

是否有可以像自动机一样使用的单子?

我正在从一些输入数据类型到输出数据类型编写流转换器.输入由用户进行,因此事件之间有一段时间.因为每个输入都需要一些资源加载,所以我想"展望未来",即将所有可能的输入发送到主计算并根据结果预加载资源.

目前,每次输入后总会有一个输出,但最终可能会改变它.

我成功地用Ross Paterson的Automaton变压器实现了这一点.我不确定我的解决方案是否最佳.

  • 有没有很好的例子如何做到这一点?也许即使有测试代码?
  • 它也可以用monad实现吗?(例子?,解释为什么不可能?)

编辑:在调用更多细节后,我在这里添加了代码.现在我将其删除(这是不可理解的)并添加一些其他解释.我的问题得到了回答.

我的目的是让主事件循环在每个用户输入之后停止,这些用户输入已被馈送到箭头/流变换器/等等.然后它将存储当前自动机状态并将所有可能的输入(假事件)逐个发送到自动机,并查看必须加载哪些资源,以缓存它们.在下一个真实事件之后,它将使用缓存来获得更好的响应.主要计算不应受此影响.

monads haskell arrows automaton

7
推荐指数
1
解决办法
1031
查看次数

Haskell数据结构具有优化的访问方法

我想创建用于访问和修改简单音乐库的数据类型,包括由曲目组成的专辑.有关基本想法,请考虑以下事项:

data MusicCollection = MC { albums :: Seq Album }
data Album = Album { albumTitle :: String, tracks :: Seq Track }
data Track = Track { trackTitle :: String, tempo  :: Tempo }

data Tempo = Unknown | BPM Int
Run Code Online (Sandbox Code Playgroud)

除了节奏,还可能有其他属性,如样式或评级.

上述解决方案让我可以快速访问随机相册.另外,我希望能够比指定速度更快地访问所有曲目.再次,对返回的曲目进行快速随机访问会很不错:

fasterThan :: Int -> MusicCollection -> SomeRandomAccessCollection Track
Run Code Online (Sandbox Code Playgroud)

更新集合中的轨道也不应该太慢.

题:

我不知道是否Map Tempo (Seq Track)最好添加一个MusicCollection,或者是否有可能以某种方式模仿关系数据库.也许有完全不同的解决方案?

我目前不想使用数据库,但了解何时在桌面应用程序中使用它们会很有趣.

haskell

6
推荐指数
2
解决办法
330
查看次数

操作monad与任意monad的翻译

我正在使用Heinrich Apfelmus 的操作单元.我想用monad为结果类型参数化解释器.以下版本的代码编译:

{-# LANGUAGE GADTs #-}

import Control.Monad.Operational

data EloI a where
    Display :: Int -> EloI ()

type Elo a = Program EloI a

interpret :: Monad m => (Int -> m ())
                     -> Elo a
                     -> Int
                     -> m a
interpret display = interp
  where
    interp :: Monad m => Elo a -> Int -> m a
    interp = eval . view
    eval :: Monad m => ProgramView EloI a -> Int -> m a …
Run Code Online (Sandbox Code Playgroud)

monads haskell

5
推荐指数
1
解决办法
263
查看次数