sml - 为什么函数类型是 ('a -> 'b) * 'a list -> 'b list?
问题描述
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) 在地图函数中键入
还有 fx :: map(f,xs') ,我认为,它应该有 'a *' 一个列表。 (如我们所知,true::[1,2,3] 是不可接受的)
当我们考虑 1::[2,3] 时,1 是 int 而 [2,3] 是 int list 所以我认为应该是('a -> 'b) * 'b list -> not ('a -> 'b) * 'a 列表 -> 'b 列表
解决方案
就 f 首先而言,f 是否应该有不同的返回类型和争论?
是的,它应该。请图片:应用于map
列表,我们要做的是将每个元素变成一个列表。
这是一个应用程序:expand [1,2,3] 3
====> [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
。在这种情况下,a
是int
while b
is int list
,你看到了吗?它们是不同的类型。
您可以在此QA中找到有关此案例的更详尽说明
所以我认为应该是 ('a -> 'b) * 'b list ->
这不是真的。('a -> 'b) * 'b list -> ????
请告诉我你的最后一种参数是什么。无论最后一种类型是什么,它都应该始终('a -> 'b) * 'a list ...
是('a -> 'b) * 'b list ...
- 的类型
f
:'a -> 'b
- 假设类型
xs
:'x list
- 然后,类型
x
:'x
注意这个表达式: (f x)
,它告诉你x
isf
的论点。因此, type'x
必须等于 type 'a
,而不是'b
。