Haskel:: 是否需要括号来构造类型的实例?

TMO*_*TTM 0 haskell

想象一个 Haskell 类型

data Person = P String
Run Code Online (Sandbox Code Playgroud)

实例化一个带括号或不带括号的人有区别吗?我真的没有看到任何:

*Main> :t P "Tim"
P "Tim" :: Person
*Main> :t (P "Tim")
(P "Tim") :: Person
*Main> p1 = P "Tim"
*Main> p2 = (P "Tim")
*Main> p1
P "Tim"
*Main> p2
P "Tim"
Run Code Online (Sandbox Code Playgroud)

lef*_*out 8

Haskell 中的括号只有在以下情况下才具有特殊含义

  • 空(可能包括空格,但从未这样做过)。那是unit value (),当出现在值级别时,或其类型,()出现在类型级别时的单位类型。
  • 包含至少一个逗号(它不属于任何内部的子表达式)。那么它是一个元组,就像 in(1,"bla")或其类型(Int, String)。元组语法也可能出现在约束中;eg(Num a, Ord a)表示基本上Num a ? Ord a,即类型a应该是Num类和Ord类的实例。
  • 分隔中缀运算符部分,例如(+2)(表示\n -> n+2)或前缀化(+) 3 4(表示3+4)。

在所有其他情况下,括号仅用于选择所需的优先级,但在其他情况下完全是可选的。特别是,f(x), (f)x, (f x),(f)(x)((((f))(((x)))))都意味着完全相同的东西,应该简单地写成f x。这适用于函数以及像您的P.

  • 您的最后一句话单独来看是准确的,但可能会误导新手读者。`fx` 与 `(fx)` 相同,但 `map fx` 与 `map (fx)` 不同。也就是说,仅当“fx”是其自己的表达式而不是嵌入不同表达式中的文本时,它们才是相同的。 (3认同)