Haskell 将Rand monad从“数据”构造中带出来?

Haskell 将Rand monad从“数据”构造中带出来?,haskell,monads,Haskell,Monads,我使用的是Control.Monad.Rand,我有一个结构 data MCSystem = MCSystem { params :: Params , path :: Path } 和函数,我不知道如何实现-- runPath返回一个Rand g Pathmonad。。。我如何提取它来生成一个新的Rand g MCSystemmonad,以便runSystem能够正确地返回它,并且可以稍后用生成器调用它 我想也许我可以把所有的东西都重

我使用的是
Control.Monad.Rand
,我有一个结构

data MCSystem = MCSystem { params :: Params
                         , path   :: Path   }
和函数,我不知道如何实现--

runPath
返回一个
Rand g Path
monad。。。我如何提取它来生成一个新的
Rand g MCSystem
monad,以便
runSystem
能够正确地返回它,并且可以稍后用生成器调用它


我想也许我可以把所有的东西都重构成读卡器monad,但我觉得如果可能的话我想避免它。

Rand
是monad的一个实例,可以用monad可以用的所有方式。就像其他单子一样,您可以“获取值”,并使用
>=
对其进行操作

例如,这适用于runSystem的定义:

runSystem system = runPath (path system) >>= \newPath -> return (MCSystem (params system) newPath)
do语法使它更漂亮:

runSystem system = do 
  newPath <- runPath (path system)
  return $ MCSystem (params system) newPath
但是,如果您还没有了解应用程序类,那么这可能没有多大意义(如果是这样的话,其他解决方案也可以)

编辑:实际上,您真正需要的是
Functor
类型类,因此这也可以工作,并且是您可以得到的最好的:

runSystem system = MCSystem (params system) <$> runPath (path system)
runSystem system=MCSystem(参数系统)运行路径(路径系统)

基本上,您将运行路径(路径系统)的结果包装在一个
MCSystem

Rand
是Monad的一个实例,可以以Monad的所有方式使用。就像其他单子一样,您可以“获取值”,并使用
>=
对其进行操作

例如,这适用于runSystem的定义:

runSystem system = runPath (path system) >>= \newPath -> return (MCSystem (params system) newPath)
do语法使它更漂亮:

runSystem system = do 
  newPath <- runPath (path system)
  return $ MCSystem (params system) newPath
但是,如果您还没有了解应用程序类,那么这可能没有多大意义(如果是这样的话,其他解决方案也可以)

编辑:实际上,您真正需要的是
Functor
类型类,因此这也可以工作,并且是您可以得到的最好的:

runSystem system = MCSystem (params system) <$> runPath (path system)
runSystem system=MCSystem(参数系统)运行路径(路径系统)

基本上你是把运行路径(路径系统)的结果包装成一个
MCSystem

我觉得有点傻,我实际上在程序的另一部分使用了do表示法,但在这个例子中我是“重构”的再加上随机性,我被我已经写过的功能性风格蒙蔽了双眼。不过,在某种程度上,应用性风格似乎更具表现力。关于开始应用程序编程,你有什么好的参考资料吗?一个好的指南是《向你学习haskell教程》。我觉得有点傻,我实际上在程序的另一部分使用了Do表示法,但在这个例子中,我是“重构”的再加上随机性,我被我已经写过的功能性风格蒙蔽了双眼。不过,在某种程度上,应用性风格似乎更具表现力。关于开始应用程序编程,你有什么好的参考资料吗?haskell教程中有一个很好的指南。