表达式的类型是什么 (n `mod` 2 == 0)

what's the type of expression (n `mod` 2 == 0)

从我的讲座中,我了解到表达式 (n `mod` 2 == 0) 的类型是 Int -> Bool 为什么它不是 Int -> Int -> Bool

n `mod` 2 的类型是 (Int -> Int) 如果我们把 n `mod` 2 写成 g = h(n) 那么 (n `mod` 2 == 0) 可以写成 g(m)其类型为 Int -> Bool 最后不应该是类型(Int -> Int -> Bool)吗?

它来自打字规则。 Haskell 的规则比下面给出的要多一些,但您可以从这些开始。

规则(3)是唯一构造函数的规则。你的表达形式来自 (1,2,4).

如果您需要有关这些规则的进一步帮助,请发表评论。

(n `mod` 2 == 0) 的类型为 Bool,实际上,该表达式等同于 (==) (mod n 2) 0,因为 (==) :: Eq a => a -> a -> Bool returns a Bool if it uses two parameters, this thus means that (n `mod` 2 == 0) has as type Bool. This will require that there is variable named n that is in scope and that n need to have as type n :: Integral a => a, so a value of a type that is a member of the Integral typeclass. It also means that mod n 2 and 0 both have to be of the same type, and that type is a member of the Eq typeclass.

如果你构造一个以n为参数的函数,比如<b>\n -></b> n <code>mod 2 == 0 则它的类型为 Integral a => a -> Bool,或者您可以进一步将其特化为 Int -> Bool,因为它是一个映射类型为 Integral a => a 的参数 n 的函数,或者专门化为 IntBool.

出于同样的原因,它不是 Int -> Int -> Bool:它不接受任何参数,并且 (n `mod` 2 == 0) 本身是一个计算结果为 Bool 的表达式,因此它的类型是 Bool。如果您构造了一个函数,例如 \n -> \m -> n `mod` 2 == 0,它的类型是 Integral a => a -> (b -> Bool) 或更简洁的 Integral a => a -> b -> Bool。这里 m 可以是任何类型的值,它的值与函数的结果无关。因此,它只是一个“临时”变量,用于使它成为一个带有两个参数的函数。

同样适用于 n `mod` 2:此表达式的更规范形式是 mod n 2,因为 mod 具有类型 mod :: Integral a => a -> a -> a 是类型 [=29] 的表达式=].此类型与 n2 的类型相同。如果我们用 n 参数创建一个函数,那么 <b>\n -></b> n <code>mod 2,那么类型此功能的 Integral a => a -> a。类型可以是 specializedInt -> Int,因为 IntIntegral 类型类的成员。