Tag: 哈斯克尔

暂停monad

Monads可以做许多惊人的,疯狂的事情。 他们可以创buildvariables来保存值的叠加。 在计算之前,它们可以让您访问未来的数据。 他们可以让你写破坏性的更新,但不是真的。 然后继续monad让你打破人心! 通常你自己的。 😉 但是,这是一个挑战:你能制造一个可以暂停的monad吗? 数据暂停sx 实例Monad(暂停) mutate ::(s – > s) – >暂停s() yield :: Pause s() step :: s – > Pause s() – >(s,Maybe(Pause s())) Pause monad是一种状态monad(因此mutate ,明显的语义)。 通常像这样的monad具有某种“运行”function,它运行计算并将您返回到最终状态。 但Pause是不同的:它提供了一个step函数,它运行计算,直到它调用魔术yield函数。 这里的计算暂停,返回给调用者足够的信息以稍后恢复计算。 对于额外的awesomne​​ss:允许调用者修改step之间的状态。 (例如上面的types签名应该允许这样做。) 用例:编写复杂的代码通常很容易,但总的PITA将其转换为在其操作中也输出中间状态。 如果你希望用户能够通过执行中途改变某些事情,事情变得非常复杂。 实施思路: 显然可以通过线程,锁和IO来完成。 但是我们可以做得更好吗? 😉 疯狂的继续单子吗? 也许某种作家monad, yield只是logging当前状态,然后我们可以通过遍历日志中的状态来“伪装”来step它。 (显然,这排除了改变步骤之间的状态,因为现在我们并不真正“暂停”任何东西。)

如何清除Haskell中的terminal屏幕?

我的用户从我的应用程序菜单中select了一个选项后,如何清除terminal屏幕?

使用foldr书写foldl

在真实世界中Haskell ,第4章函数式编程 用foldr写foldl: — file: ch04/Fold.hs myFoldl :: (a -> b -> a) -> a -> [b] -> a myFoldl fz xs = foldr step id xs z where step xga = g (fax) 上面的代码使我困惑不已,有些叫做dps的人用一些有意义的名字来重写它,使之更加清晰: myFoldl stepL zeroL xs = (foldr stepR id xs) zeroL where stepR lastL accR accInitL = accR (stepL accInitL lastL) […]

Haskell Cont monad如何以及为何工作?

这是Cont monad的定义: newtype Cont ra = Cont { runCont :: (a -> r) -> r } instance Monad (Cont r) where return a = Cont ($ a) m >>= k = Cont $ \c -> runCont m $ \a -> runCont (ka) c 你能解释一下为什么这个工作原理? 它在做什么?

哈斯克尔:电梯vs电梯

在什么情况下应该使用liftIO ? 当我使用ErrorT String IO , lift函数ErrorT IO动作ErrorT到ErrorT ,所以liftIO看起来是多余的。

数据构造器在GHC-7.6中的推广

我有这样的代码: class SymbolSet tpe where data Symbol tpe :: * data SSet tpe where Identity :: tpe -> SSet tpe And :: SSet tpe -> Symbol tpe -> SSet tpe class HasElem ab where instance (SymbolSet tpe) => HasElem (And (Identity tpe) s) s instance (HasElem sset s) => HasElem (And sset s) s 正在编写GHC-7.4。 […]

使用MonadRef来实现MonadCont

有一个众所周知的问题, 我们不能使用foralltypes中的所有types 。 但是应该可以有以下定义: class Monad m => MonadCont' m where callCC' :: ((a -> forall b. mb) -> ma) -> ma shift :: (forall r.(a -> mr) -> mr) -> ma reset :: ma -> ma 然后find一个有意义的实例。 在本文中 ,作者声称我们可以在MonadFix上面实现MonadFix并提供m实现的MonadFix和MonadRef 。 但是我想如果我们有一个MonadRef我们实际上可以实现callCC' : –satisfy law: mzero >>= f === mzero class Monad m => MonadZero […]

Haskell中的exception处理

我需要帮助来理解三个Haskell函数的用法 尝试( Control.Exception.try :: Exception e => IO a -> IO (Either ea) ) catch( Control.Exception.catch :: Exception e => IO a -> (e -> IO a) -> IO a ) handle( Control.Exception.handle :: Exception e => (e -> IO a) -> IO a -> IO a ) 我需要知道几件事情: 我什么时候使用哪个function? 如何用一个简单的例子来使用这个函数? 捕获和处理的区别在哪里? 他们有几乎相同的签名只有一个不同的顺序。 我会尽力写下我的试炼,希望你能帮助我: 尝试 […]

哈斯克尔:为什么约定名称辅助函数“去”?

在阅读Haskell资料或来源时,我看到了很多,但是我从来没有真正感觉到这一点 – (我想它在我脑海里有“goto”的负面含义)。 我开始跟LYAH一起学习Haskell,这就是我在写褶皱的时候使用acc和step的倾向。 写作大会从哪里来? 最重要的是,这个名字到底是什么意思呢?

Monads作为附件

我一直在阅读有关monad的分类理论。 单子的一个定义使用一对伴随函数。 单子是通过使用这些函数的往返来定义的。 显然附加类在分类理论中是非常重要的,但是我还没有看到Haskell monads在伴随函数方面的任何解释。 有没有人给它一个想法?