Haskell IO字符串->;列表
嘿,伙计们,我需要一些帮助,如何使用sum内置函数对文件中的列表求和 例如: text.txt包含[1,2,3,4] 我想从这个文件中得到这个列表,然后用这个内置的和来求和这些数字。可能吗 谢谢 当然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
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"