我正在尝试使用Haskell进行目录结构的递归下降.我想只根据需要检索子目录和文件(懒惰).
我编写了以下代码,但是当我运行它时,跟踪显示在第一个文件之前访问了所有目录:
module Main where
import Control.Monad ( forM, forM_, liftM )
import Debug.Trace ( trace )
import System.Directory ( doesDirectoryExist, getDirectoryContents )
import System.Environment ( getArgs )
import System.FilePath ( (</>) )
-- From Real World Haskell, p. 214
getRecursiveContents :: FilePath -> IO [FilePath]
getRecursiveContents topPath = do
names <- getDirectoryContents topPath
let
properNames =
filter (`notElem` [".", ".."]) $
trace ("Processing " ++ topPath) names
paths <- forM properNames $ \name -> do
let path = topPath …Run Code Online (Sandbox Code Playgroud) 如何生成包含所有可能排列的最短序列?
示例:对于长度2,答案为121,因为此列表包含12和21,这些都是可能的排列.
对于长度3,答案是123121321,因为该列表包含所有可能的排列:123,231,312,121(无效),213,132,321.
每个数字(在给定的排列中)可能只出现一次.
如何生成列表元素的所有可能组合?
例如,给定列表[1,2,3],我想设计一个谓词,其形式comb([1,2,3], L).应返回以下答案L:
[1]
[2]
[3]
[1,2]
[2,1]
[1,3]
[3,1]
[2,3]
[3,2]
[1,2,3]
[1,3,2]
[2,1,3]
[2,3,1]
[3,1,2]
[3,2,1]
Run Code Online (Sandbox Code Playgroud) 我正在使用F#规范的最终工作流程的修改版本,以便在Xbox上进行开发.看来,Xbox上的.net框架不支持尾调用.因此,我必须在编译时禁用尾调用优化.
虽然最初似乎这种限制会阻止在计算表达式中使用任何形式的循环,但我最初认为"步进"可以避免这个问题:计算表达式中的递归函数f不直接调用自身,而是返回一个包含lambda的最终值,该lambda调用f.
实验表明我对while循环是正确的(它们在计算表达式中使用时不会导致堆栈溢出),但不是关于递归函数.
为了澄清,这有效:
// Wait until "start" or "A" is pressed on one of the gamepads.
// Set "player" when that happens.
let player : PlayerIndex option ref = ref None
while (!player).IsNone do
for p in all_players do
let state = GamePad.GetState(p)
if state.IsConnected
&& (state.Buttons.Start = ButtonState.Pressed
|| state.Buttons.A = ButtonState.Pressed) then
player := Some p
do! sys.WaitNextFrame()
Run Code Online (Sandbox Code Playgroud)
这会导致堆栈溢出:
// Wait until "start" is pressed on the controlling gamepad.
let rec wait() = task {
input.Update()
if …Run Code Online (Sandbox Code Playgroud) 在阅读真实世界的Haskell时,我想出了这个说明:
ghci> :info (+)
class (Eq a, Show a) => Num a where
(+) :: a -> a -> a
...
-- Defined in GHC.Num
infixl 6 +
Run Code Online (Sandbox Code Playgroud)
但是Haskell如何定义+为非本机函数?在某种程度上,你必须说2 + 3它将成为汇编程序,即机器代码.
考虑我有一个数组[3,18,15,25,26],可以从中形成多少个可能的二叉搜索树?
我们有n个人坐在圆桌旁.任何人都可以与任何其他人握手.这些人可以通过多少方式进行握手,这样就不会有两次握手相互交叉.
我在技术访谈论坛中发现了这个难题,但没有答案.我能想到的一种方法是找到握手的所有排列,然后检查每个排列是否满足.
任何人都可以请求任何其他更有效的解决方案.
@edit:评论澄清:N会是均匀的.
我一直在尝试用变量创建我的解析器表达式,并将它们简化为二次表达式.
这是我的解析器语法:
Exercise : Expr '=' Expr
Expr : Term [+-] Expr | Term
Term : Factor [*/] Term | Factor
Factor: Atom [^] Factor | Atom
Atom: Number | Identified | [- sqrt] Atom | '(' Expr ')'
Run Code Online (Sandbox Code Playgroud)
对于解析我正在使用递归下降解析器.我想说我想解析一下:
"2 - 1 + 1 = 0"
结果为0,解析器创建错误的树:
-
/ \
2 +
/ \
1 1
Run Code Online (Sandbox Code Playgroud)
我怎样才能使这个语法保持联想?我是新手,请你告诉我哪里可以找到更多信息?我可以用递归下降解析器实现这一点吗?
grammar parsing recursive-descent associativity left-recursion
这个memoize函数() -> 'a 在运行时使用Null-Argument-Exception在类型的任何函数上失败.
let memoize f =
let cache = System.Collections.Generic.Dictionary()
fun x ->
if cache.ContainsKey(x) then
cache.[x]
else
let res = f x
cache.[x] <- res
res
Run Code Online (Sandbox Code Playgroud)
有没有办法写一个memoize函数,也适用于() -> 'a?
(我现在唯一的选择是使用一个Lazy类型.调用x.Force()来获取值.)
所以我一直在构建一个程序,使用蒙特卡罗模拟来找到进化图论的属性.其中一个关键功能是能够生成均匀分布的随机图,以便我们可以确定图的广义属性.对于连接无向图的情况,我已经实现了本答案中概述的解决方案.
然而,对于有向图,生成从Wilson算法得到的单向均匀生成树并不能确保图形是强连通的,并且似乎添加额外的边缘以使生成树双向会引入偏差您生成的图表.
我觉得我可能会遗漏一些明显/误解的东西,但基本上我的要求是,有人可以向我推荐一个高级方案,允许我生成强连接,均匀分布的随机图吗?