Haskell:读取一个双打文本文件,并将包含它们的列表分配给列表变量

时间:2018-06-28 22:56:35

标签: haskell io monads

好的,我是来自Python的Haskell社区的新手,这使我发疯。

我有一个文本文件,看起来像: “ 1.2 1.423 2.43“。

我想读取此文本文件,并将其存储为list_var中的双打列表。所以list_var = [1.2,1.423,2.43]。该list_var将在程序中进一步使用。

我似乎没有找到有关如何执行此操作的答案,大多数答案都可以打印出list_var,例如Haskell - Read a file containing numbers into a list,但我还需要list_var!

我尝试过:

DevoSnsTopic

不起作用,readLines为

get_coefficients :: String -> [Double]
get_coefficients file_1 = do
 coefficients_fromfile <- readLines "test2.txt"
 let coefficients = map readDouble coefficients_fromfile
 return coefficients

,readDouble是

readLines :: FilePath -> IO [String]
readLines = fmap lines . readFile

谢谢!

1 个答案:

答案 0 :(得分:2)

由于您使用return,因此您的输出以monad表示,在本例中为IO monad。错误消息告诉您,您应该更改此行:

get_coefficients :: String -> [Double]

对此:

get_coefficients :: String -> IO [Double]

这是由于Haskell的核心原则:参照透明性。

如果要使用生成的[Double],则仍必须将其保存在IO monad中,就像这样:

main :: IO ()
main = do
    -- This can be thought of as taking out values from the monad,
    -- but requires the promise that it'll be put back into a monad later.
    doubles <- get_coefficients "This argument does nothing, why?"
    -- This prints the list of doubles. Note: it returns an IO (),
    -- thus fufills the promise!
    -- print :: Show a => a -> IO ()
    print doubles