【发布时间】:2013-12-28 23:22:50
【问题描述】:
我希望我的术语在这里是正确的 - 如果不是,请随时编辑任何内容。
我在撰写关于组合博弈论的论文时使用 Haskell 作为辅助语言 - 即,我的所有函数都只是处理数字并帮助我为我正在研究的游戏找到解决方案。
我为一个具体的、完整的“棋盘大小”(想想棋盘、5x5 等)编写了所有函数。我想扩展到任何大小的学习板,因此通过包含一个整数参数来修改所有相关函数。 例如,
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 引用,而仅仅依靠其他设置大小的东西每个需要使用的功能。
我想我可能正在寻找一个单子,但我不知道。
【问题讨论】:
-
也许您只需要在绑定大小的 where 子句中定义所有函数?
-
@augustss:我想到了这一点,但我认为会有一种更优雅的方式来解决它。
-
感谢所有回复和 cmets - 解决此问题的方法比我预期的要多。希望这个答案可以帮助其他人。
标签: design-patterns haskell monads state-monad