为什么功能类型是(’a->’b)*’列表->’b列表?

时间:2018-10-11 10:02:14

标签: sml smlnj

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列表

1 个答案:

答案 0 :(得分:1)

  

从f开始,f的争论类型是否应该具有不同的回报类型?

是的,应该。请形象化:将AbtractFoo应用于列表,我们要做的就是将每个元素变成一个列表。

这是一个应用程序:map ====> expand [1,2,3] 3。在这种情况下,[[1, 1, 1], [2, 2, 2], [3, 3, 3]]a,而intb,您看到了吗?它们是不同的类型。

您可以在此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