haskell - 使用 getArgs 或用户输入
问题描述
刚接触 Haskell 并正在努力解决问题。我知道为什么我的代码不起作用,但我无法找出解决方案。
目的是让用户通过参数提供文件名,或者如果没有提供,则提示用户输入数据。带有文件名的消息将打印到屏幕上并处理文件。
import System.Environment
main = do
args <- getArgs
let file = if null args
then do putStr "File: " ; getLine
else head args
putStr "processing"
putStrLn file
writeFile file "some very nice text"
当然,代码是错误的,但它展示了我一直在努力解决的逻辑。Happy Learn Haskell和Learn you Haskell都无法让我大吃一惊。我能找到的最接近的线程是这个。非常感谢您的帮助。
解决方案
让我们分析 的类型file
:
let file = if null args
then do putStr "File: " ; getLine
else head args
这里 if
--语句有 as 条件then
,它确实是 a ,所以我们是安全的。但该部分具有 as 类型。所以 Haskell 的理由应该是一个,但它不是:它是一个s 的列表,所以。else
null args
Bool
then
IO String
args
[IO String]
String
[String]
后来又出现了另一个问题:你使用file
as String
,但它不是:它仍然是IO String
.
有几种方法可以修复它。可能最小的变化是使用pure
将head args
后面包装成一个IO
,并使用用语句替换let
子句<-
:
import System.Environment
main = do
args <- getArgs
file <- if null args
then do putStr "File: " ; getLine
else pure (head args)
putStr "processing "
putStrLn file
writeFile file "some very nice text"
推荐阅读
- c# - 如何防止 MS Word 文档中出现新行?
- amazon-web-services - Cloudfront 403 绕过
- javascript - D3 按钮输入更改数据(堆积条形图)
- file - 方案:使用 open-i/o-file 函数
- c - 斐波那契函数的尾递归版本
- arrays - 如何访问或遍历嵌套的对象数组,这些对象有时可能是无限的,或者用户在nodejs中的json数组对象中不断添加?
- apache-spark - 在数据框上调用 createOrReplaceGlobalTempView 时出现问题
- c++ - 使用输入值的 C++ 静态 constexpr
- r - 将 Drugbank ID 替换为药物名称
- dynamics-crm - Dynamics crm + 如何在插件代码中根据类型动态获取属性值