这是我要加载的文件:
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 +)等法律表达被拒绝。
答案 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更快,并且仍然提供更好的错误消息。