【问题标题】:Couldn't match type `[]' with `IO' -- Haskell无法将类型“[]”与“IO”匹配——Haskell
【发布时间】:2014-10-17 11:44:26
【问题描述】:

我是 Haskell 的初学者。在此任务中,我正在执行拆分操作,但由于类型不匹配而面临问题。我正在从文本文件中读取数据,数据是表格格式。前任。 1|2|Rahul|13.25. 采用这种格式。这里| 是定界符,所以我想从定界符| 中拆分数据,并想打印第二列和第四列数据,但我收到这样的错误

  "Couldn't match type `[]' with `IO'
    Expected type: IO [Char]
      Actual type: [[Char]]
    In the return type of a call of `splitOn'"

这是我的代码..

module Main where

import Data.List.Split

main = do
    list <- readFile("src/table.txt")
    putStrLn list
    splitOn "|" list

对此的任何帮助将不胜感激..谢谢

【问题讨论】:

    标签: haskell types char


    【解决方案1】:

    问题是您试图从main 函数返回一个列表,该函数的类型为IO ()

    您可能想要做的是打印结果。

    main = do
        list <- readFile("src/table.txt")
        putStrLn list
        print $ splitOn "|" list
    

    【讨论】:

    • 好的,谢谢。它工作正常,但如果我想获取第 2 列和第 4 列的值,那么如何获取这些值?我更新了这样的代码..module Main where import Data.List.Split main = do list
    • @Rahul 这听起来像是一个新问题,而不是评论,因为这完全回答了您的问题。
    【解决方案2】:

    不是 Haskell,但它看起来像一个典型的 awk 任务。

    cat src/table.txt | awk -F'|' '{打印 $2, $4}'

    回到 Haskell,我能找到的最好的方法是:

    module Main where
    
    import Data.List.Split(splitOn)
    import Data.List (intercalate)
    
    project :: [Int] -> [String] -> [String]
    project indices l = foldl (\acc i -> acc ++ [l !! i]) [] indices
    
    fromString :: String -> [[String]]
    fromString = map (splitOn "|") . lines
    
    toString :: [[String]] -> String
    toString = unlines . map (intercalate "|")
    
    main :: IO ()
    main = do
      putStrLn =<<
        return . toString . map (project [1, 3]) . fromString =<<
        readFile("table.txt")
    

    如果不是从文件读取,而是从标准输入读取,interact 函数可能很有用。

    【讨论】:

    • project indices l = [ l !! i | i &lt;- indices ] 呢?
    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    相关资源
    最近更新 更多