fun map (f,xs) =
xs of
[] => []
| x::xs’ => (f x)::(map(f,xs’))
(’a -> ’b) * ’a list -> ’b list
从f开始,f的争论类型是否应该具有不同的回报类型?
如果将f用作双精度函数(fn x => 2 * x),则其类型为int-> int
所以我不明白为什么为什么在地图功能中使用('a->'b)类型
我也认为x :: map(f,xs')它应该有一个'a *'列表。 (我们知道,true :: [1,2,3]是不可接受的)
当我们考虑1 :: [2,3]时,则1是int而[2,3]是int列表 所以我认为应该是('a->'b)*'b列表->而不是(’a->’b)* a列表->‘b列表
答案 0 :(得分:1)
从f开始,f的争论类型是否应该具有不同的回报类型?
是的,应该。请形象化:将AbtractFoo
应用于列表,我们要做的就是将每个元素变成一个列表。
这是一个应用程序:map
====> expand [1,2,3] 3
。在这种情况下,[[1, 1, 1], [2, 2, 2], [3, 3, 3]]
是a
,而int
是b
,您看到了吗?它们是不同的类型。
您可以在此QA
中找到有关此情况的更详尽的解释所以我认为应该是('a->'b)*'b列表->
那不是事实。 int list
请告诉我您最后一种参数是什么。无论最后一种类型是什么,都应始终为('a -> 'b) * 'b list -> ????
而不是('a -> 'b) * 'a list ...
('a -> 'b) * 'b list ...
的类型:f
'a -> 'b
的类型:xs
'x list
的类型:x
请注意以下表达式:'x
,它告诉您(f x)
是x
的参数。因此,类型f
必须等于类型'x
,而不是'a
。