首页 > 解决方案 > 为什么函数类型是 ('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 列表

标签: smlsmlnj

解决方案


就 f 首先而言,f 是否应该有不同的返回类型和争论?

是的,它应该。请图片:应用于map列表,我们要做的是将每个元素变成一个列表。

这是一个应用程序:expand [1,2,3] 3====> [[1, 1, 1], [2, 2, 2], [3, 3, 3]]。在这种情况下,aintwhile bis 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),它告诉你xisf的论点。因此, type'x必须等于 type 'a,而不是'b


推荐阅读