我使用Operational Monad方法编写了一个具有Writer功能的monad.然后我注意到它懒惰不起作用.
在下面的代码中,有一个rogueWriter
执行无限多个语句,每个语句都写一个字符串.该程序不会终止althaugh只需要无限输出的某些字符.
经过我的分析,我发现流氓作家实际上非常友好(哈哈),因为当我改变runMyWriter rogueWriter
时runWriter rogueWriter
,一切顺利.
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
我经常使用表单的表达式maybe (return ()) someFunc someMaybe
.
Monad m => (a -> m ()) -> Maybe a -> m ()
在hoogle上搜索函数不会产生特定结果.这个没有库函数吗?
我正在从一些输入数据类型到输出数据类型编写流转换器.输入由用户进行,因此事件之间有一段时间.因为每个输入都需要一些资源加载,所以我想"展望未来",即将所有可能的输入发送到主计算并根据结果预加载资源.
目前,每次输入后总会有一个输出,但最终可能会改变它.
我成功地用Ross Paterson的Automaton变压器实现了这一点.我不确定我的解决方案是否最佳.
编辑:在调用更多细节后,我在这里添加了代码.现在我将其删除(这是不可理解的)并添加一些其他解释.我的问题得到了回答.
我的目的是让主事件循环在每个用户输入之后停止,这些用户输入已被馈送到箭头/流变换器/等等.然后它将存储当前自动机状态并将所有可能的输入(假事件)逐个发送到自动机,并查看必须加载哪些资源,以缓存它们.在下一个真实事件之后,它将使用缓存来获得更好的响应.主要计算不应受此影响.
我想创建用于访问和修改简单音乐库的数据类型,包括由曲目组成的专辑.有关基本想法,请考虑以下事项:
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,或者是否有可能以某种方式模仿关系数据库.也许有完全不同的解决方案?
我目前不想使用数据库,但了解何时在桌面应用程序中使用它们会很有趣.
我正在使用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)