2016-01-26 46 views
1

锈使用冒号从类型Rust函数定义返回类型的起源是什么?

let x: u8 = 1; 

但是分开的标识符,等等,用于函数返回类型 - >来代替。例如:

fn f() -> u8 { ... } 

人们可能期望它在这里使用一个冒号,以及:

fn f(): u8 { ... } 

在使用箭头具有一定的优先级(例如,在Haskell),我很好奇这背后的历史原因选择。另外,我也很好奇它是纯粹的美学原因还是使用箭头有一些技术原因,例如简化解析。

+6

'x'的类型是'u8'; 'f'的类型是* not *'u8'。 – Shepmaster

+0

这是约定。许多语言都使用它。 C++有尾随返回类型。 OCaml具有类似的功能签名样式。它只是。 – erip

+1

一个可能的原因是在数学中,箭头表示从一个域到一个共域的映射。例如,'f:X - > Y'; 'f'是集合'X'到集合'Y'的映射。 – erip

回答

5

嗯,我只是猜测,但我会说,原因是纯粹的审美。 :通常发音为“has the type”,而->发音为“to”。因此,f: fn(i32) -> i32意味着“f 具有来自i32i32”功能的类型“。

基本上,存在其中可以提到的函数的返回值两个上下文:

  1. 功能项目的声明:一个函数的

    fn foo(x: i32) -> i32 { 
        … 
    } 
    
  2. 分配到与显式类型的可变:

    let f: fn(x: i32) -> i32 = foo; 
    

虽然使用冒号而不是箭头不会伤害第一种情况下的可读性,但它肯定会在第二种情况下这样做。在两种情况下都具有相同的符号是非常合理的。

此箭头的最终来源是Simply Typed Lambda Calculus,其中此箭头用作函数类型构造函数。从那里它来到Haskell,斯卡拉(好吧,不完全是,他们使用=>)和其他语言。

+0

我认为重要的是要注意,如果你使用':T'来表示返回类型,这意味着''''的类型'是'T'。尽管如此,Rust函数并不是一流的对象;他们没有类型。关闭是这个例外(因为它们是匿名的)。 – erip

+2

@erip你是什么意思? Rust函数确实有[types](https://doc.rust-lang.org/reference.html#function-types)。 – kirelagin

+0

我站好了。但是,结论是一样的:函数的返回类型不能用冒号表示。 – erip

相关问题