定义纯函数时出现语法错误

时间:2011-09-02 21:37:05

标签: haskell

鉴于以下功能,我收到来自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

3 个答案:

答案 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