我有一个 Haskell 程序,它从命令行接受 2 或 3 个 Int
:
-- test.hs
main :: IO ()
main = do
args <- fmap (read . head) getArgs
case args of
[x,y,a] -> doGeneration x y a
[x,y] -> doGeneration x y 10
_ -> usage
但是,当我使用参数运行它时:
$ ./test 100 200
divide: Prelude.read: no parse
为什么?
最佳答案
getArgs :: IO [String]
返回 String
的列表s,通过头部然后 args
然后它将 read
该项目。
但是,您从未指定它应该读取的内容,因为您使用 args
在 case … of …
条款 [x,y,a]
和[x, y]
,它会尝试将其读取为数字列表(数字的类型由 doGeneration
签名指定。这意味着您应该将其写为:
$ ./test <strong>[100,200]</strong>
但我认为这样做没有多大意义,你可以将解析部分重写为:
main :: IO ()
main = do
args <- fmap <strong>(map read)</strong> getArgs
case args of
[x,y,a] -> doGeneration x y a
[x,y] -> doGeneration x y 10
_ -> usage
这意味着它将 read
单独的每个参数,并用解析的项目构造一个列表,然后我们可以对程序参数的解析部分进行模式匹配。在这种情况下我们仍然可以使用:
$ ./test <strong>100 200</strong>
关于haskell - Haskell 中的命令行参数为 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69176850/