我遇到了计算变化的DP问题的以下解决方案:
count' :: Int -> [Int] -> Int
count' cents coins = aux coins !! cents
where aux = foldr addCoin (1:repeat 0)
where addCoin c oldlist = newlist
where newlist = (take c oldlist) ++ zipWith (+) newlist (drop c oldlist)
Run Code Online (Sandbox Code Playgroud)
它比我天真的自上而下的递归解决方案运行得快得多,我仍然试图理解它.
我得到一个硬币列表,aux计算正整数的每个解决方案.因此,金额的解决方案是在该位置索引列表.
不过,我不太清楚addCoin.它以某种方式使用每个硬币的价值从硬币列表中绘制元素?我正在努力为它找到一个直观的意义.
折叠aux也将我的大脑绑在一起.为什么是1:repeat 0初始值?它代表什么?
我有一个带可编辑节点的JTree.
如何以编程方式触发树状单元格编辑事件,即调出节点重命名文本框来代替突出显示的节点,就像用户手动突出显示它并按下F2一样?
基本上我想添加一个"重命名"菜单项或工具栏按钮,以便在树的特定功能上提示用户,并且我希望它在用户突出显示节点时与F2按键功能相同.
我有以下ADT:
type Program = [Expr]
data Expr =
Num Int
| Bool Bool
| Binding String Expr
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
这是表单的变量绑定表达式的解析器lhs is rhs.
binding :: Parser Expr
binding = do
lhs <- word
spaces
string "is"
spaces
rhs <- expr
return $ Binding lhs rhs
Run Code Online (Sandbox Code Playgroud)
它工作正常,但当我尝试将其转换为应用风格时,它会给出错误的结果.
binding :: Parser Expr
binding = Binding <$> word <* (spaces *> string "is" *> spaces) *> expr
Run Code Online (Sandbox Code Playgroud)
更换*>用>>在parenthesised部分也不能工作.这两种实现有什么区别?是否有一个组合器用于组合两个解析器并忽略两者的结果?
尝试调试Debug.trace也不起作用......没有打印.
binding :: Parser Expr
binding = (\x …Run Code Online (Sandbox Code Playgroud) 我在一个模块中定义了一个变体,另一个模块基本上扩展了变体,但是我使用的是一个多态变体.
为了防止子表达式Extended.exp成为那些Core.exp,结后来被束缚.
module Core = struct
type 'a expr_f = [
| `Int of int
| `Plus of 'a expr_f * 'a expr_f
]
type expr = expr expr_f
end
module Ex = struct
type 'a expr_f = [
| 'a Core.expr_f
| `Times of 'a expr_f * 'a expr_f
]
type expr = expr expr_f
end
Run Code Online (Sandbox Code Playgroud)
这似乎有效,直到我们使用递归函数遍历类型的值Ex.expr.
let rec test : Ex.expr -> Ex.expr = function
| `Int i -> `Int i
| …Run Code Online (Sandbox Code Playgroud)