【发布时间】:2016-04-16 16:57:14
【问题描述】:
我又一次被 haskell 困住了。这次我应该使用我难以理解的 IO 过滤 CSV 数据集。任何额外的相关信息表示赞赏。
结构是预先确定的,对我来说似乎很混乱。这真的是一个人应该做的吗? (我仍然必须这样做,所以这是一个有点“侧面”的问题)。
getRawData' :: String -> IO [[String]]
getRawData' fn = do
s <- readFile fn
return $ parseCSVsimple s
getRawData :: String -> IO [[String]]
getRawData fn = do
d <- getRawData' fn
return (dropEmpty d)
dropEmpty [[String]] -> [[String]]
DropEmpty - 这是我需要帮助的地方 对于“正常”列表,我会直接过滤它,但是这个 IO 和不同的函数相互调用让我感到困惑。
对不起,愚蠢的问题,我已经编程了 8 个月,从那时起不得不使用 6-7 种语言。任何与该问题相关的一般信息也非常感谢。
编辑;跟进:
感谢良好的答案,我提高了理解并实现了以下代码:
dropEmpty :: [[String]] -> [[String]]
dropEmpty = filter(not . null)
但是,我仍然在列表中看到空列表。这是因为我正在检查整个列表列表是否为空?如何确定我想检查“内部”列表?
【问题讨论】:
-
一旦你到达
dropEmpty,你就在 IO 之外,只需要关心纯粹的 Haskell。所以,只需像普通列表一样过滤它。 -
你的 dropEmpty 函数是正确的。请记住,Haskell 的列表是不可变的,因此您的 dropEmpty 输入列表不会被修改,您必须检查函数的结果