haskell - Haskell 中的命令行参数为 Int

标签 haskell io monads

我有一个 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该项目。

但是,您从未指定它应该读取的内容,因为您使用 argscase … 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/

相关文章:

c - 在 C 代码中写入和读取 long int 值

c - 从包含数组的文件中存储/检索特定数组

scala - Scala 中的 Monad 变形金刚

scala - 取消选择已选择的选项

generics - 为什么使用 GHC.Generics 会出现不明确的类型变量错误?

c - 是否可以将事件文件描述符与中断驱动输入结合使用?

haskell 错误 "parse error on input ‘if'“

haskell - 如何在带有 do 表示法的列表上使用 map - 即避免使用 `IO ()' 类型的 `[IO ()]' 类型?

haskell - 在标准 ML 中根据 foldr 定义 foldl

pointers - Haskell 运行时如何表示惰性值?