小编Guy*_*der的帖子

在Haskell中流式传输目录的递归下降

我正在尝试使用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)

haskell directory-structure lazy-evaluation

11
推荐指数
2
解决办法
1938
查看次数

生成具有所有排列的序列

如何生成包含所有可能排列的最短序列?

示例:对于长度2,答案为121,因为此列表包含12和21,这些都是可能的排列.

对于长度3,答案是123121321,因为该列表包含所有可能的排列:123,231,312,121(无效),213,132,321.

每个数字(在给定的排列中)可能只出现一次.

algorithm sequence superpermutation

10
推荐指数
2
解决办法
5486
查看次数

列表元素的置换组合 - Prolog

如何生成列表元素的所有可能组合?

例如,给定列表[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)

prolog

10
推荐指数
2
解决办法
1万
查看次数

使用最终工作流程时,缺少尾调用优化是一个障碍吗?

我正在使用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)

f# tail-recursion tail-call-optimization

10
推荐指数
2
解决办法
581
查看次数

Haskell如何实际定义+函数?

在阅读真实世界的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它将成为汇编程序,即机器代码.

haskell

10
推荐指数
2
解决办法
491
查看次数

给定一个排序的整数数组,如何从它形成二进制搜索树?

考虑我有一个数组[3,18,15,25,26],可以从中形成多少个可能的二叉搜索树?

algorithm binary-search-tree data-structures catalan

10
推荐指数
3
解决办法
5709
查看次数

拼图:N人坐在圆桌上.没有穿过任何其他握手的握手方式

我们有n个人坐在圆桌旁.任何人都可以与任何其他人握手.这些人可以通过多少方式进行握手,这样就不会有两次握手相互交叉.

我在技术访谈论坛中发现了这个难题,但没有答案.我能想到的一种方法是找到握手的所有排列,然后检查每个排列是否满足.

任何人都可以请求任何其他更有效的解决方案.

@edit:评论澄清:N会是均匀的.

puzzle algorithm catalan

10
推荐指数
3
解决办法
8720
查看次数

表达式解析器语法和左关联性

我一直在尝试用变量创建我的解析器表达式,并将它们简化为二次表达式.

这是我的解析器语法:

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

10
推荐指数
1
解决办法
4414
查看次数

记住类型() - >'a的函数

这个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()来获取值.)

f# unit-type

10
推荐指数
2
解决办法
1073
查看次数

生成强连通,均匀分布的随机二元图

所以我一直在构建一个程序,使用蒙特卡罗模拟来找到进化图论的属性.其中一个关键功能是能够生成均匀分布的随机图,以便我们可以确定图的广义属性.对于连接无向图的情况,我已经实现了答案中概述的解决方案.

然而,对于有向图,生成从Wilson算法得到的单向均匀生成树并不能确保图形是强连通的,并且似乎添加额外的边缘以使生成树双向会引入偏差您生成的图表.

我觉得我可能会遗漏一些明显/误解的东西,但基本上我的要求是,有人可以向我推荐一个高级方案,允许我生成强连接,均匀分布的随机图吗?

random algorithm directed-graph motzkin-numbers

10
推荐指数
1
解决办法
498
查看次数