要了解Turtle
,我认为修改教程中的示例会很好。我选择从输出的每一行中删除reduntant“FilePath”,认为这将是一个简单的练习。
然而,尽管作者努力使他的图书馆易于使用,但我几乎没有用它来解决这个简单的问题。
我尝试了所看到的每件事,看起来它会让我以某种方式将>>=
从IO
提升到Shell
:MonadIO
,FoldM
,{{ 1}},liftIO
没有成功。我变得沮丧,只有通过阅读_foldIO
源代码,我才能找到似乎有效的东西(“没有明显的缺陷”浮现在脑海中)。
为什么这么难?如何使用此库的API从逻辑上获得解决方案?
Turtle
答案 0 :(得分:3)
您不会将IO
从Shell
提升为Shell
。 Monad
已有>>=
个实例,该实例附带了自己的IO
函数。您可以使用Shell
将liftIO
操作提升到foldM
,也可以使用fold
或sh
运行shell。如果您不关心结果,请使用Shell
运行main = sh $ do
homedir <- home
filepath <- lstree $ homedir </> "projects"
case (toText filepath) of
Right path -> liftIO $ T.putStrLn x
Left approx -> return () -- This shouldn't happen
。
我相信你的例子可以简化为
FilePath
至于从stringPath :: FilePath -> String
stringPath filepath =
case (toText filePath) of -- try to use the human readable version
Right path -> T.unpack path
Left _ -> encodeString filePath -- fall back on the machine readable one
获取字符串的困难,我不认为这可以归咎于Turtle作者。我认为它可以简化为
main = sh $ do
homedir <- home
filepath <- lstree $ homedir </> "projects"
liftIO $ putStrLn (stringPath filepath)
结合这将简化示例
main = view $ do
homedir <- home
filepath <- lstree $ homedir </> "projects"
return $ stringPath filepath
或
spark-submit