如果有人可以帮我解决这个问题吗?
标准前奏函数takeWhile的类型为(a -> Bool) -> [a] -> [a]
记下Haskell表达式takeWhile even
的类型
函数even
定义为:
even x = x `mod` 2 == 0
这会被认为是对的吗?
takeWhile:: Num a => (a->Bool) -> [a] -> [a]
答案 0 :(得分:2)
要导出takeWhile even
的类型签名,您需要先查看takeWhile
和even
的类型签名。根据GHCi,这些功能的类型签名如下。
takeWhile :: (a -> Bool) -> [a] -> [a]
even :: Integral a => a -> Bool
在takeWhile even
的情况下,takeWhile
接受类型为(a -> Bool)
的函数,因此该函数接收类型a
的某个值并返回{{ 1}}。
Bool
函数接受even
值并返回Integral
值,因此可以将其作为第一个参数传递给Bool
。由于takeWhile
类型类由几个不同的类型实现,例如Integral
和Int
,因此您可以传入实现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]