表达式的类型是什么 (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
的函数,或者专门化为 Int
到 Bool
.
出于同样的原因,它不是 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] 的表达式=].此类型与 n
和 2
的类型相同。如果我们用 n
参数创建一个函数,那么 <b>\n -></b> n <code>mod
2,那么类型此功能的 Integral a => a -> a
。类型可以是 specialized 到 Int -> Int
,因为 Int
是 Integral
类型类的成员。
从我的讲座中,我了解到表达式 (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
的函数,或者专门化为 Int
到 Bool
.
出于同样的原因,它不是 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] 的表达式=].此类型与 n
和 2
的类型相同。如果我们用 n
参数创建一个函数,那么 <b>\n -></b> n <code>mod
2,那么类型此功能的 Integral a => a -> a
。类型可以是 specialized 到 Int -> Int
,因为 Int
是 Integral
类型类的成员。