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教程中有一个很好的指南。