Parsing Haskell***异常:Prelude.read:无解析

Parsing Haskell***异常:Prelude.read:无解析,parsing,haskell,parse-error,Parsing,Haskell,Parse Error,您好,我正试图完成CIS194 Spring 13,这时我收到错误消息***异常:Prelude.read:我的一个函数没有解析。函数所在的文件名为LogAnalysis.hs,函数名为parseMessage,但该文件也从Log.hs导入。为什么我会收到此错误消息,如何修复它 这是我的密码: read是一个类型为read::read a=>String->a的函数。这意味着read接受String作为输入,并返回某个类型a的值,前提是a实现了read type类。read必须知道要返回的特定类

您好,我正试图完成CIS194 Spring 13,这时我收到错误消息***异常:Prelude.read:我的一个函数没有解析。函数所在的文件名为LogAnalysis.hs,函数名为parseMessage,但该文件也从Log.hs导入。为什么我会收到此错误消息,如何修复它

这是我的密码: read是一个类型为read::read a=>String->a的函数。这意味着read接受String作为输入,并返回某个类型a的值,前提是a实现了read type类。read必须知道要返回的特定类型,它可以通过以下两种方式之一知道:要么显式地将类型指定给它,例如read 123::Int或read True::Bool,要么从上下文推断。在您的例子中,read推断它必须返回Int,因为LogMessage期望Int作为其第二个参数。因此,在本例中,表达式read[y]的意思是:获取字符y,将其转换为一个元素字符串,然后尝试通过解析将其转换为Int。现在,如果y碰巧包含一个非十进制数字的字符,它将抛出一个异常,因为它不知道如何将其转换为整数

现在你如何处理这个问题?在调用之前,必须检查要读取的输入是否正常。例如,您可以使用以下命令检查y是否为数字:

或者,您可以使用类似于读取的from,但如果失败,它不会引发异常,而是返回nothing值:

parseMessage (x:y:z)
  | x == 'I', Just n <- readMaybe [y] = LogMessage Info n (unwords [z])

问题在于您的输入消息格式。您将一行作为字符串读取,然后匹配字符串中的字符,因为字符串的类型是[Char]的别名。 在sample.log中,完成犰狳处理的第一行I6将作为字符串传递给parseMessage,参数将采用以下值:

x=‘我’

y=''-单个空白字符

z=6完成犰狳加工

read获取空白字符并抛出***异常:Prelude.read:无解析

要获取值,可以执行以下操作:

    parseMessage :: String -> LogMessage
    parseMessage msg = 
      case words msg of
        "I":y:z -> LogMessage Info (read y :: TimeStamp) (unwords z)
        "W":y:z -> undefined
        "E":y:z -> undefined
        _       -> undefined
这样就可以很容易地提取本例中的前两个有效单词MessageType和TimeStamp

    parseMessage :: String -> LogMessage
    parseMessage msg = 
      case words msg of
        "I":y:z -> LogMessage Info (read y :: TimeStamp) (unwords z)
        "W":y:z -> undefined
        "E":y:z -> undefined
        _       -> undefined