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 和了解你的Haskell 都不能让我超越驼峰。我能找到的最接近的线程是this one。非常感谢您的帮助。
答案 0 :(得分:1)
让我们分析一下file
的类型:
let file = if null args
then do putStr "File: " ; getLine
else head args
此处if
- then
- else
语句的条件为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 <- getArgs
file <- if null args
then do putStr "File: " ; getLine
else pure (head args)
putStr "processing "
putStrLn file
writeFile file "some very nice text"