3

我一直想学习 Haskell,所以最近我开始解决 ProjectEuler 问题。在编写以下因式分解代码时,我注意到调用(/ n)返回一段Float时间(n `div`)返回一个Int. 我认为中缀符号只是 Haskell 中的语法糖?有人可以解释发生了什么吗?我也很感激任何意见/建议/改进,谢谢。

    import Data.List (sort)

    factor :: Int -> [Int]
    factor 0 = [1..]
    factor n =
        let f1 = [f | f <- [1..limit], n `mod` f == 0]
                where limit = ceiling $ sqrt $ fromIntegral n
            f2 = map (n `div`) f1   --vs. map (/ n) f1
        in sort $ f1 ++ f2
4

2 回答 2

16

div并且/是两个不同的功能:

  • /在类Fractional中定义,其含义是乘法的逆运算。
  • div在Integral类中定义,其含义是将整数除以截断向负无穷大。

你是对的,中缀符号只是一种语法糖。表达式x / y与 相同(/) x y,也div x y与 相同x `div` y

于 2012-08-07T15:03:36.737 回答
3

没有什么特别的事情发生。该div函数是类的一部分,并且根据您的显式类型签名Integral更具体地推断为。运算符是类Int的一部分。这是两个不同的功能,一个不是另一个的语法糖!/Fractional

于 2012-08-07T15:03:46.997 回答