Haskell表达式的类型甚至是

时间:2016-06-15 10:31:08

标签: haskell types

如果有人可以帮我解决这个问题吗?

标准前奏函数takeWhile的类型为(a -> Bool) -> [a] -> [a]

记下Haskell表达式takeWhile even的类型 函数even定义为:

even x = x `mod` 2 == 0

这会被认为是对的吗?

takeWhile:: Num a => (a->Bool) -> [a] -> [a]

1 个答案:

答案 0 :(得分:2)

要导出takeWhile even的类型签名,您需要先查看takeWhileeven的类型签名。根据GHCi,这些功能的类型签名如下。

takeWhile :: (a -> Bool) -> [a] -> [a]

even :: Integral a => a -> Bool

takeWhile even的情况下,takeWhile接受类型为(a -> Bool)的函数,因此该函数接收类型a的某个值并返回{{ 1}}。

Bool函数接受even值并返回Integral值,因此可以将其作为第一个参数传递给Bool。由于takeWhile类型类由几个不同的类型实现,例如IntegralInt,因此您可以传入实现Integer类型类的任何此类型的值。

您需要注意的是,在Integer中,takeWhile中的a未绑定到任何类型类,但在(a -> Bool)中,相应的even是绑定到a类型类。在这种情况下,这会导致生成的表达式将Integral类型签名中的a绑定到takeWhile。例如,在这种情况下,您可以想象Integral具有以下类型签名:

takeWhile

此外,由于takeWhile :: Integral a => (a -> Bool) -> [a] -> [a] 的第一个参数由takeWhile填充,因此结果表达式的类型签名没有even项。

因此,您将为(a -> Bool)留下以下类型签名。因此,takeWhile even会接收takeWhile even值列表,并返回相同类型的Integral值列表。

Integral

如果要使用GHCi进行确认,可以运行以下命令来获取表达式的类型签名:

takeWhile even :: Integral a => [a] -> [a]