相关疑难解决方法(0)

镜头,fclabels,数据访问器 - 用于结构访问和变异的库更好

至少有三个流行的库用于访问和操作记录字段.我所知道的是:数据访问器,fclabels和镜头.

我个人开始使用数据访问器,现在我正在使用它们.然而最近在haskell-cafe上有一个fclabels优越的意见.

因此,我对这三个(也许更多)库的比较感兴趣.

haskell record data-structures lenses

170
推荐指数
1
解决办法
2万
查看次数

功能性镜片

有人可以向我解释功能性镜片吗?谷歌这是一个令人惊讶的困难主题,我没有取得任何进展.我所知道的是,它们提供了类似于OO的获取/设置功能.

haskell functional-programming lenses

78
推荐指数
2
解决办法
1万
查看次数

Haskell - 使用StateT monad变换器链接两个州

我有两个或更多独立状态要在一个Haskell应用程序中跟踪.

我正在使用声明两个新类型

type MonadTuple m = MonadState (Int, Int) m
type MonadBool m = MonadState Bool m
Run Code Online (Sandbox Code Playgroud)

monad变换器堆栈声明为

type Stack = StateT (Int, Int) (StateT Bool IO) ()
Run Code Online (Sandbox Code Playgroud)

我打算像这样使用堆栈

ret :: Stack
ret = apply

apply :: (MonadTuple m, MonadBool m) => m ()
apply = undefined
Run Code Online (Sandbox Code Playgroud)

该编译器是不高兴,因为它不能匹配Bool(Int, Int)试图检查时Stack符合MonadBool.

我知道在StateT中组合多个状态时给出的解决方案.除了箭头带镜头的全局状态之外,还有其他更简单的解决方案吗?

附录:完整的代码块是

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}

import Control.Monad.State.Class
import Control.Monad.State.Lazy

type MonadTuple m …
Run Code Online (Sandbox Code Playgroud)

haskell state-monad monad-transformers

2
推荐指数
1
解决办法
319
查看次数