我正在尝试更加熟练地使用递归方案,因为到目前为止,它们对于将粗糙的显式递归代码转变为不那么尖峰的东西确实很有帮助。在实现可能与显式递归真正混淆的算法时,我倾向于使用的其他工具之一是 monad 转换器/可变性。理想情况下,我希望对递归方案足够熟悉,这样我就可以完全放弃状态性。我仍然会使用 Transformer 的算法的一个例子是带有 alpha beta 剪枝的极小极大算法。我用变形和极小极大 f 代数 ( data MinimaxF a f = MMResult a | MMState [f] Bool) 做了正常的极小极大,但我不确定如何扩展它来进行 alpha beta 剪枝。我想也许我可以使用组织同态,或者也许有一些带有comonads的自定义解决方案,但我不知道如何尝试使用这两种技术的解决方案。
除了使用递归方案的 alpha beta 修剪版本之外,我们将非常感谢您提供有关解决类似问题的任何一般建议。例如,我在将递归方案应用于 Dijkstra 等通常以命令式方式实现的算法时遇到了麻烦。
recursion haskell functional-programming comonad recursion-schemes
我希望能够检查我的 Jest 测试是成功还是失败。关于这个主题还有另一个 SO 问题,但解决方案使用 Jasmine,有点 hacky,并且绝不保证继续与 Jasmine 或 Jest 的未来版本一起使用。我正在寻找解决这个问题的方法,它不会像 Jasmine 那样依赖于很大的依赖项。
我已经用c ++编程了一段时间,但我还没有找到任何官方文档(如http://ruby-doc.org/).现在我正在使用http://en.cppreference.com/w/这样的网站.哦,最后导致我写这个的东西是我总是找到使用过时的库和其他垃圾的文档,我找不到任何使用c ++ 11和14的功能的文档
我想根据 John Hughes 的论文Generalizing Monads to Arrows编写一个解析器。在通读并尝试重新实现他的代码时,我意识到有些事情不太合理。在一节中,他根据 Swierstra 和 Duponchel 的论文Deterministic, error-correcting combinator parsers using Arrows展示了一个解析器实现。他描述的解析器类型是这样的:
data StaticParser ch = SP Bool [ch]
data DynamicParser ch a b = DP (a, [ch]) -> (b, [ch])
data Parser ch a b = P (StaticParser ch) (DynamicParser ch a b)
Run Code Online (Sandbox Code Playgroud)
组合运算符看起来像这样:
(.) :: Parser ch b c -> Parser ch a b -> Parser ch a c
P (SP e2 st2) (DP f2) . P (SP e1 …Run Code Online (Sandbox Code Playgroud) 我有这个 AST 数据结构
data AST = Integer Int
| Let String AST AST
| Plus AST AST
| Minus AST AST
| Times AST AST
| Variable String
| Boolean Bool
| If AST AST AST
| Lambda String AST Type Type
| Application AST AST
| And AST AST
| Or AST AST
| Quot AST AST
| Rem AST AST
| Negate AST
| Eq AST AST
| Leq AST AST
| Geq AST AST
| Neq AST …Run Code Online (Sandbox Code Playgroud) recursion haskell functional-programming comonad recursion-schemes
使用命令通过 brew 安装 glfw 后,我无法创建版本超过 2.1 的 GLFW 窗口brew install glfw。
基本上我的问题是这段代码有效:
import qualified Graphics.UI.GLFW as GLFW
configAndCreateWindow :: IO (Maybe GLFW.Window)
configAndCreateWindow = do
GLFW.windowHint (GLFW.WindowHint'ContextVersionMajor 2)
GLFW.windowHint (GLFW.WindowHint'ContextVersionMinor 1)
GLFW.createWindow 100 100 "test" Nothing Nothing
main :: IO ()
main = do
GLFW.init
maybeWindow <- configAndCreateWindow
case maybeWindow of
Nothing -> putStrLn "Failure :("
Just _ -> putStrLn "Success!"
Run Code Online (Sandbox Code Playgroud)
但如果我改变
GLFW.windowHint (GLFW.WindowHint'ContextVersionMajor 2)
GLFW.windowHint (GLFW.WindowHint'ContextVersionMinor 1)
Run Code Online (Sandbox Code Playgroud)
到
GLFW.windowHint (GLFW.WindowHint'ContextVersionMajor 3)
GLFW.windowHint (GLFW.WindowHint'ContextVersionMinor 3)
Run Code Online (Sandbox Code Playgroud)
它坏了。
为了确保它与 GLFW-b …
是否有一个类似镜头的物体的通用名称/类型不满足取出你放入的东西的特性?例如listLength :: Lens [a] Int,如果您输入的长度比源列表的长度短,则会得到一个缩短的列表,但是如果您输入的长度更长,则原始长度将被保留。