Haskell:为什么我可以在ghci中加载这个文件但是当我尝试在拥抱中做同样的事情时我得到语法错误?

时间:2014-02-02 03:06:51

标签: haskell ghci hugs

这是我要加载的文件:

import Data.List (foldl')
import Text.Printf (printf)
import Data.Char (ord)

--data IntParsedStr = Int | ParsingError
--data ParsingError = ParsingError String

asInt :: String -> Either String Integer
asInt "" = Left "Empty string"
asInt xs@(x:xt) | x == '-' = either Left (Right . ((-1) *)) (asInt' xt)
                | otherwise = either Left Right (asInt' xs)
                where asInt' :: String -> Either String Integer
                      asInt' "" = Left "No digits"
                      asInt' xs = foldl' step (Right 0) xs
                                where step :: Either String Integer -> Char -> Either String Integer
                                      step (Left e) _ = Left e
                                      step (Right ac) c = either Left (Right . (10 * ac + ) . fromIntegral) (charAsInt c)

charAsInt :: Char -> Either String Int
charAsInt c | between (ord '0') (ord c) (ord '9') = Right $ ord c - ord '0'
            | otherwise = Left $ printf "'%c' is not a digit" c

checkPrecision str = either error ((str == ). show) (asInt str)

between :: Ord t => t -> t -> t -> Bool
between a b c = a <= b && b <= c

它在ghci中加载没有任何问题,但在拥抱中我收到此错误:

  

ERROR“folds.hs”:17 - 表达式中的语法错误(意外的`)')

第17行是asInt函数

定义中的最后一行

修改:

嗨! 我最近发现,这实际上是一个已知的拥抱问题,如question所述 哪里有Hugs 98 Users Guide的链接,表示

  

(a + b +)和(a * b +)等法律表达被拒绝。

1 个答案:

答案 0 :(得分:3)

我认为这是Hugs的一个错误,而不是GHC的自由。 Haskell 98报告(适用于Hugs使用情况)说

  

语法优先规则适用于以下部分。当且仅当(op e)以与(x op e)相同的方式解析时,(x op (e))才合法;和(e op)类似。例如,(*a+b)在语法上无效,但(+a*b)(*(a+b))有效。因为(+)是左关联的,(a+b+)在语法上是正确的,但(+a+b)不是;后者可以合法地写成(+(a+b))

我将其解释为允许(10 * ac + ),因为(*)(+)都是左关联的,而且(*)的优先级更高。

正如评论中指出的那样,((10 * ac) + )被两者都接受,因此是一种解决方法。

有趣的是,这并未在Hugs vs Haskell 98 page中列出,因此Mark P. Jones可能会以不同的方式阅读报告的这一部分。当然,我可以原谅他; Gofer在Haskell允许之前很久就实现了构造函数类,而Hugs在编译时仍然比GHCi更快,并且仍然提供更好的错误消息。