Haskell IO字符串->;列表

Haskell IO字符串->;列表,haskell,io,Haskell,Io,嘿,伙计们,我需要一些帮助,如何使用sum内置函数对文件中的列表求和 例如: text.txt包含[1,2,3,4] 我想从这个文件中得到这个列表,然后用这个内置的和来求和这些数字。可能吗 谢谢 当然 main = do contents <- readFile "text.txt" print . sum . read $ contents main=do 内容IO字符串将文件读入字符串 read::reada=>String->a将String转换为readtypec

嘿,伙计们,我需要一些帮助,如何使用sum内置函数对文件中的列表求和

例如: text.txt包含[1,2,3,4]

我想从这个文件中得到这个列表,然后用这个内置的和来求和这些数字。可能吗

谢谢

当然

main = do
    contents <- readFile "text.txt"
    print . sum . read $ contents
main=do
内容IO字符串
将文件读入字符串

  • read::reada=>String->a
    String
    转换为
    read
    typeclass中的任何类型。如果编译器无法确定所需的类型,则可能必须添加类型注释。在这种情况下,编译器可以计算出来,因为我们在结果上使用了
    sum
    ,所以它推断
    a
    必须是
    [Integer]
    。(它实际上推断出
    numa=>[a]
    ,但由于类型默认,它默认为
    [Integer]

    read
    要求相同类型的
    show
    生成相同的格式


  • 请注意,我必须使用do符号从
    IO字符串
    中提取
    字符串
    ,以便对其应用
    read

    如果列表始终采用这种格式,则需要使用
    read
    功能。此函数用于反序列化数据,即将字符串转换为程序数据类型。比如说,

    Prelude> read "[1, 2, 3, 4]" :: [Int]
    [1,2,3,4]
    
    现在,您可以将其与文件IO相结合,但如果您不熟悉Monads,则需要阅读Monads。一些好的资源是[]和维基百科。本质上,每个monad将表示顺序执行中的一个步骤——这是必要的,因为IO修改了环境,因此必须确定其执行顺序

    我为阅读和总结而产生的代码是:

    main = do
        fc <- readFile "file1"
        parsed <- return (read fc :: [Int])
        putStrLn (printf "sum: %d" (sum parsed))
    
    main=do
    
    fc因此,您将无法实际获取值
    :[Int]
    ,因为这是不安全的。但是我们可以让您转到
    IO[Int]
    ,然后通过
    >=
    将其传递到
    打印中:

    main = (sum . read) `fmap` readFile "myFile" >>= print
    
    如果您使用的是
    Control.Applicative
    ,则可以使其更加美观:

    main = sum . read <$> readFile "myFile" >>= print
    

    这太棒了,因为它更简单,而且不依赖于
    控件;更重要的是,它不必像@hammar指出的那样“由内而外”读取。

    从技术上讲,编译器会猜测您想要的类型(通过使用默认值),因为
    sum
    可以对多个数字类型进行操作。另请参阅标签中的常见问题。@augustss哇,这样更好!谢谢。它从右到左的阅读效果更好,而你必须从里到外阅读应用程序的。谢谢,虽然不太好,但它不理解没有“[”的空格分隔的数字字符。@Alehar如果你没有大括号,你可以试试
    words
    函数,去掉尾随的逗号。如果你需要更高级的东西,你可以试试Parsec解析器。
    main = print . sum . read =<< readFile "myFile"