gpt4 book ai didi

haskell - 使用 getArgs 或用户输入

转载 作者:行者123 更新时间:2023-12-02 01:01:12 25 4
gpt4 key购买 nike

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 HaskellLearn you Haskell 都无法让我渡过难关。我能找到的最接近的线程是 this one .非常感谢您的帮助。

最佳答案

让我们分析一下 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 的列表s,所以 [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 - 使用 getArgs 或用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50487784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com