使用 getArgs 或用户输入
Using getArgs or user input
Haskell 的新手,正在努力解决问题。我知道为什么我的代码不起作用,但我想不出解决方案。
目的是让用户通过参数提供文件名,或者,如果提供了 none,则提示用户输入数据。带有文件名的消息将打印到屏幕并处理文件。
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 都无法让我渡过难关。我能找到的最接近的线程是 this one。非常感谢您的帮助。
我们来分析一下file
的类型:
let file = if null args
then do putStr "File: " ; getLine
else head args
这里的if
-then
-else
语句有as条件null args
,确实是Bool
,所以我们是安全的。但是 then
部分的类型为 IO String
。所以 Haskell 原因 args
应该是 [IO String]
,但它不是:它是 String
的列表,所以 [String]
.
后来又出现了一个问题:你把file
当成了String
,但它不是:它仍然是IO String
。
有几种方法可以修复它。可能最小的变化是使用 pure
将 head args
包装回 IO
,并使用 <-
语句替换 let
子句:
import System.Environment
main = do
args <b><-</b> getArgs
file <b><-</b> if null args
then do putStr "File: " ; getLine
else <b>pure (</b>head args<b>)</b>
putStr "processing "
putStrLn file
writeFile file "some very nice text"
Haskell 的新手,正在努力解决问题。我知道为什么我的代码不起作用,但我想不出解决方案。
目的是让用户通过参数提供文件名,或者,如果提供了 none,则提示用户输入数据。带有文件名的消息将打印到屏幕并处理文件。
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 都无法让我渡过难关。我能找到的最接近的线程是 this one。非常感谢您的帮助。
我们来分析一下file
的类型:
let file = if null args
then do putStr "File: " ; getLine
else head args
这里的if
-then
-else
语句有as条件null args
,确实是Bool
,所以我们是安全的。但是 then
部分的类型为 IO String
。所以 Haskell 原因 args
应该是 [IO String]
,但它不是:它是 String
的列表,所以 [String]
.
后来又出现了一个问题:你把file
当成了String
,但它不是:它仍然是IO String
。
有几种方法可以修复它。可能最小的变化是使用 pure
将 head args
包装回 IO
,并使用 <-
语句替换 let
子句:
import System.Environment
main = do
args <b><-</b> getArgs
file <b><-</b> if null args
then do putStr "File: " ; getLine
else <b>pure (</b>head args<b>)</b>
putStr "processing "
putStrLn file
writeFile file "some very nice text"