我希望我的术语在这里是正确的 - 如果没有,随时编辑任何东西.
我正在使用Haskell作为辅助语言,同时撰写关于组合博弈论的论文 - 也就是说,我的所有函数都只是兼顾数字并帮助我找到我正在研究的游戏的解决方案.
我为具体的,整体的"板尺寸"编写了所有功能(想想chequerboard,5x5等).我想扩展到任何规模的研究板,因此通过包含Integer参数来修改所有相关功能.例如,
type Size = Int
squares :: Size -> [Square]
squares size = [ (x,y) | x <- [1..size],
y <- [1..size]]
Run Code Online (Sandbox Code Playgroud)
然而,这开始变得混乱.通常我认为与大小无关的函数在访问需要大小的函数时必须提供大小.
这很快导致这样的行:
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)
Run Code Online (Sandbox Code Playgroud)
(请注意,函数的内容确实无关紧要,我只是想表明它已经变得无用了.)
我非常有信心使用Haskell,并且通常使用函数式编程,但我不知道如何去除所有这些size引用,并且仅仅依赖于为需要使用它的每个函数设置大小的其他东西. .
我想我可能正在寻找一个单子,但我不知道.
我能写一个执行IO作为副作用的函数吗?例如:
f :: Int -> Int
f n = putStr "text" >> return n*2
Run Code Online (Sandbox Code Playgroud)
显然我没有任何方法来编写代码,如果它完全不正确,但这应该至少显示我想要做的事情.
如果我有这样的列表:
lst = [4,4,4,5,3,3,9]
Run Code Online (Sandbox Code Playgroud)
我可以group用来创造这个:[[4,4,4],[5],[3,3],[9]].
如果我有一个指向列表的索引,例如,i = 4指向第一个3元素的索引,我怎样才能最好地编写一个带有列表和索引的函数,并返回索引指向的组的大小(在这种情况下, 2,3s组的长度)?
我知道我可以非常强制地写出来,并且我也可以将某些内容与某些内容联系起来map length . group并计算我在查找索引时通过的组数,但在我看来,必须有一个更好的方法来执行此操作.欢迎所有建议.