All*_*lan 8 monads haskell design-patterns state-monad
我希望我的术语在这里是正确的 - 如果没有,随时编辑任何东西.
我正在使用Haskell作为辅助语言,同时撰写关于组合博弈论的论文 - 也就是说,我的所有函数都只是兼顾数字并帮助我找到我正在研究的游戏的解决方案.
我为具体的,整体的"板尺寸"编写了所有功能(想想chequerboard,5x5等).我想扩展到任何规模的研究板,因此通过包含Integer参数来修改所有相关功能.例如,
type Size = Int
squares :: Size -> [Square]
squares size = [ (x,y) | x <- [1..size],  
                         y <- [1..size]]
然而,这开始变得混乱.通常我认为与大小无关的函数在访问需要大小的函数时必须提供大小.
这很快导致这样的行:
reaching size = (losing size) \\\ (setA size)
takeUDmir _  []       = []
takeUDmir size (x:xs) = [x] ++ takeUDmir size (xs \\\ mirUD size x)
rotate size s = concatMap (mirUD size) (mirLR size s)
(请注意,函数的内容确实无关紧要,我只是想表明它已经变得无用了.)
我非常有信心使用Haskell,并且通常使用函数式编程,但我不知道如何去除所有这些size引用,并且仅仅依赖于为需要使用它的每个函数设置大小的其他东西. .
我想我可能正在寻找一个单子,但我不知道.
J. *_*son 12
这是拉出Readermonad 的最佳时机- 它抽象了一些全局可用的只读配置数据的概念.
data Config = Config { size :: Int, ... }
type MyMonad = Reader Config
fun :: MyMonad Result
fun = funNeedingTheSize <$> asks size <*> pure arg1 <*> pure arg2
runMyMonad :: Config -> MyMonad a -> a
runMyMonad = flip runReader