鉴于以下功能,我收到来自GHC的解析错误。
has_empty_string :: [String] -> Bool
has_empty_string col =
not foldl (\acc now -> if and [acc == True, now == ""] then False else True) True col
我检查了各种教程,但没有看到错误。
当我将let
添加到定义中时,更令人困惑的是GHC接受它。
重写以使用any_null。
我怀疑这个错误实际上是在其他地方......
module Main where
import System.Cmd
import System.Directory
import System.Environment
import System.IO
import System.Process
import Text.Regex.Posix
import Data.CSV.Enumerator
import Data.Spreadsheet
import Data.Char (isSpace)
--------------------------------------------------
slurp :: String -> IO String
slurp path = do
withFile path ReadMode (\handle -> do
contents <- hGetContents handle
last contents `seq` return contents )
--------------------------------------------------
has_empty_string :: [String] -> Bool
has_empty_string col =
any null
main :: IO ()
main = do
[filename] <- getArgs
raw_data <- slurp filename
let csv_data = fromString '"' ',' raw_data
-- checking to see if the 5th column is an empty string
content_hashes = get_hashrow csv_data
where get_hashrow = map (\row -> row !! 5) csv_data
is_good_csv = has_empty_hash content_hashes
putStrLn $ show csv_data
答案 0 :(得分:2)
答案 1 :(得分:2)
你得到错误,因为函数应用程序在Haskell中具有最高优先级,所以
not f x
读取
(not f) x
顺便说一句,您尝试实现的功能可以用更简洁的方式编写
has_empty_strings list = not $ all (/= []) list
答案 2 :(得分:1)
我想问题是,not
后你缺少一对括号(你也可以使用$
)。此外,还有&&
运算符,用于简单和。您不必使用额外的列表。用逻辑替换if-then-else可以更容易理解。最后,我使用毫无意义的风格,因为我喜欢它。
has_empty_string = not . foldl (\acc now -> not $ acc == True && now == "") True
如果您在交互式提示符(GHCi)中定义了某些内容,则始终必须键入let
,因为提示类似于一个大do
语句。
PS:编写此函数的一种更简单的方法是
has_empty_string = all null
但我想你宁愿拥有
has_empty_string = any null