【问题标题】:Can someone explain this error?有人可以解释这个错误吗?
【发布时间】:2011-08-29 22:01:41
【问题描述】:

我是 Haskell 的新手,在语法的一些微妙之处苦苦挣扎。为什么会这样:

reduceBy a f n
    | n < 2 = (a,f)
    | (a `mod` n) == 0 = 
        reduceBy( floor $ fromIntegral a / fromIntegral n) (f++[n]) n
    | otherwise = (a, f)

虽然这有错误:(无法将预期类型 `(a, [a])' 与推断类型 `[a] -> a -> (a, [a])' 匹配)

reduceBy a f n
    | n < 2 = (a,f)    
    | (a `mod` n) == 0 = 
        reduceBy( floor(fromIntegral a / fromIntegral n) (f++[n]) n )    
    | otherwise = (a, f)

?

【问题讨论】:

  • reduceBy (floor $ fromIntegral a / fromIntegral n) (f++[n]) n 等价于reduceBy (floor (fromIntegral a / fromIntegral n)) (f++[n]) n
  • 正如第一条评论还显示的那样,作为一种风格,每当您需要为参数加上括号时,开括号通常不会放在函数之后,而是放在参数的开头,例如reduceBy (floor (... 而不是 reduceBy( floor( ...
  • 附注( floor $ fromIntegral a / fromIntegral n)可以写成(a `div` n)

标签: haskell syntax


【解决方案1】:

你的新右括号来得太晚了。应该是

... reduceBy (floor(fromIntegral a / fromIntegral n)) ...

$ 的绑定相当弱,但括号胜过一切。

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多