小编Dav*_*e B的帖子

Haskell"无所事事"IO,或者如果没有别的话

我想在Haskell中做一些看起来像这样的事情:

main1 = do s <- getLine
           if s == "foo" then putStr "You entered foo"
Run Code Online (Sandbox Code Playgroud)

显然这是不合法的,因为没有else.我想到的另一种选择:

nop :: IO ()
nop = sequence_ []

main2 = do s <- getLine
           if s == "foo" then putStr "You entered foo" else nop
Run Code Online (Sandbox Code Playgroud)

这有点冗长,但如果有必要,我会满足.如果没有内置版本,我会感到惊讶nop.

或者:

doIf :: Bool -> IO () -> IO ()
doIf b m = if b then m else nop

main3 = do s <- getLine
           doIf (s == "foo") (putStr "You entered …
Run Code Online (Sandbox Code Playgroud)

io syntax haskell

75
推荐指数
2
解决办法
3万
查看次数

使用FileUtils.listFiles以递归方式查找目录

我想收集目录下所有文件的列表,特别是包括子目录.我不喜欢自己做事,所以我使用的FileUtils.listFiles是Apache Commons IO.所以我有类似的东西:

import java.io.File;
import java.util.Collection;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;

public class TestListFiles {
  public static void main(String[] args) {
    Collection<File> found = FileUtils.listFiles(new File("foo"),
        TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
    for (File f : found) {
      System.out.println("Found file: " + f);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是,这似乎只能找到普通文件,而不是目录:

$ mkdir -p foo/bar/baz; touch foo/one_file
$ java -classpath commons-io-1.4.jar:. TestListFiles
Found file: foo/one_file
Run Code Online (Sandbox Code Playgroud)

我已经传递TrueFileFilter给两个滤镜了,所以我想不出更具包容性的东西.我希望它列出:( "foo", "foo/one_file", "foo/bar", "foo/bar/baz"以任何顺序).

我也会接受非FileUtils解决方案,但是我必须编写自己的BFS,甚至从我所获得的列表中收集父目录集似乎很愚蠢.(无论如何,这将错过空子目录.)这是在Linux,FWIW.

java apache-commons-io

18
推荐指数
5
解决办法
5万
查看次数

标签 统计

apache-commons-io ×1

haskell ×1

io ×1

java ×1

syntax ×1