我想在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) 我想收集目录下所有文件的列表,特别是包括子目录.我不喜欢自己做事,所以我使用的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.