swift函数表示法背后的推理?

时间:2016-12-15 00:43:47

标签: swift language-design language-features

为什么Swift使用此函数表示法:

func greet(person: String, day: String) -> String {
    return "Hello \(person), today is \(day)."
}

我不明白为什么它使用小箭头->表示法来指定返回类型。 func identifier() -> Type代替更明智的内容,例如Type identifier()

我在Haskell中看到了类似的符号,但在Haskell中它对我有意义,因为Haskell使用curried函数,因此箭头表示函数currying。在快速,它似乎冗长和多余。

这种设计选择背后的原因是什么?

请客观地回答这个问题。这不是基于意见的,因为我不是在征求意见,我只是想知道设计选择背后的原因。

1 个答案:

答案 0 :(得分:2)

这个问题很可能因为基于意见而被关闭99%,但我会尝试对可能促使这种选择的动机进行客观的尝试。

大多数C类语言的格式都是Type identifier(params)。不可否认,这是源于C的原创设计。 C ++,Java,C#都遵循这种风格。

这种风格对于非平凡类型存在重大问题,因为它很难在没有首先阅读类型并解析它的情况下挑选方法名称。考虑一下这种非常典型的Java方法:

...
public static final Map<String, Array<MyGenericType<Foo, Bar>>> myMethodName(Type param) { ... }
...

方法名称myMethodName位于屏幕的中间位置(假设您遵循120字符的统治代码标准,而不是80字符代码标准)。这真的很傻。

样式指南已经提到了这一点,对于许多C语言,建议将名称放在新行上,包括前一行的所有类型信息,访问说明符等。这在C ++中尤为普遍。

从C ++中的Boost库中考虑这个真实的示例。

template <class A1, class A2, class A3, class A4, class A5, class A6>
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
{ 
   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
   return result_type(); 
}
很多人会建议像这样写:

template <class A1, class A2, class A3, class A4, class A5, class A6>
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type 
auto make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
{ 
   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
   return result_type(); 
}

但无论如何,C ++合作实现了这种疯狂,现在允许将其写成:

template <class A1, class A2, class A3, class A4, class A5, class A6> 
make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&) -> inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type
{ 
   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
   return result_type(); 
}