Haskell: прочитайте текстовый файл двойников и назначьте список, содержащий их, переменной списка - PullRequest
0 голосов
/ 29 июня 2018

Хорошо, я новичок в сообществе Haskell, пришедшем из Python, и это сводит меня с ума.

У меня есть текстовый файл, похожий на: «1,2 1,423 2,43" .

Я хочу прочитать этот текстовый файл и сохранить его в виде списка парных чисел в list_var. Итак, list_var = [1.2,1.423,2.43]. Этот list_var будет использоваться в дальнейшем.

Я просто не могу найти ответ, как это сделать, большинство ответов может распечатать list_var, например Haskell - Считать файл, содержащий числа, в список , но мне нужен list_var дальше по строке!

Я пытался:

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

, который не работает, readLines -

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

и readDouble is

readDouble :: String -> Double
readDouble = read

Заранее спасибо!

1 Ответ

0 голосов
/ 29 июня 2018

Поскольку вы используете return, ваш вывод находится в монаде, в данном случае в монаде IO. Как говорится в сообщении об ошибке, вы должны изменить эту строку:

get_coefficients :: String -> [Double]

К этому:

get_coefficients :: String -> IO [Double]

Это из-за основного принципа Haskell: ссылочная прозрачность.

Если вы хотите использовать произведенный [Double], вы все равно должны хранить его в монаде IO, например:

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
...