代码之家  ›  专栏  ›  技术社区  ›  anon_swe

SML:如果->是右关联的

  •  2
  • anon_swe  · 技术社区  · 10 年前

    乌尔曼的书, ML编程的元素 ,介绍了映射函数的简单版本,定义如下:

    fun simpleMap(F, nil) = nil
    |   simpleMap(F, x::xs) = F(x)::simpleMap(F, xs);
    
    val map = fn : ('a -> 'b) * 'a list -> 'b list
    

    鉴于->是正确的联想,你不会这样做吗:

    ('a -> 'b) * ('a list -> 'b list) ?
    

    但这是不正确的,因为域类型是由函数和列表组成的元组,而范围类型只是一个列表。

    我哪里出错了?

    谢谢

    1 回复  |  直到 10 年前
        1
  •  6
  •   Tikhon Jelvis    10 年前

    在SML中,类型运算符 * -> :它具有更高的优先级,就像 * 优先级高于 + 在算术方面。

    这就是为什么 string * string -> string (string * string) -> string 而不是 string * (string -> string) 。要阅读您的示例,我们需要在 * 在担心如何 -> 联系:

    (('a -> 'b) * 'a list) -> 'b list