gpt4 book ai didi

design-patterns - 如何参数化我的 Haskell 函数?

转载 作者:行者123 更新时间:2023-12-04 05:07:00 24 4
gpt4 key购买 nike

我希望我的术语在这里是正确的——如果不是,请随时编辑任何内容。

我在写一篇关于组合博弈论的论文时使用 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引用,并且简单地依赖其他东西来设置每个需要使用它的功能的大小。

我想我可能正在寻找一个单子(monad),但我不知道。

最佳答案

这是拔出Reader的最佳时机monad——它抽象了一些全局可用的只读配置数据的概念。

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

关于design-patterns - 如何参数化我的 Haskell 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com