我一直想学习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
答案 0 :(得分:15)
div
和/
是两个不同的功能:
/
在类Fractional中定义,它的意思是乘法的逆运算。div
在类Integral中定义,它的意思是整数除以截断为负无穷大。你是对的,中缀符号只是一个语法糖。表达式x / y
与(/) x y
相同,div x y
与x `div` y
相同。
答案 1 :(得分:3)
没有什么特别的事情发生。 div
函数是Integral
类的一部分,并且根据您的显式类型签名更具体地推断为Int
。 /
运算符是Fractional
类的一部分。这是两个不同的功能,一个不是另一个的语法糖!