模式匹配什么时候需要括号?
When are brackets required for pattern matching?
使用此代码:
-- Store a person's name, age, and favourite Thing.
data Person = Person String Int Thing
deriving Show
brent :: Person
brent = Person "Brent" 31 SealingWax
stan :: Person
stan = Person "Stan" 94 Cabbage
getAge :: Person -> Int
getAge (Person _ a _) = a
访问斯坦使用的年龄:
getAge stan
打印:
94
定义 stan 不需要括号。
然而 getAge Person "a" 1 Cabbage
导致错误:
<interactive>:60:8:
Couldn't match expected type `Person'
with actual type `String -> Int -> Thing -> Person'
Probable cause: `Person' is applied to too few arguments
In the first argument of `getAge', namely `Person'
In the expression: getAge Person "a" 1 Cabbage
我需要使用括号:
*Main> getAge (Person "a" 1 Cabbage)
1
为什么在这种情况下需要括号?但是定义 stan = Person "Stan" 94 Cabbage
时不需要括号 ?
getAge Person "a" 1 Cabbage
被解析为
(((getAge Person) "a") 1) Cabbage
即这必须是接受 Person
-constructor 和另外三个参数的函数,而不是接受单个 Person
-value[ 的函数=29=].
为什么是 done this way?好吧,它使多参数函数变得更好。例如,Person
本身就是一个函数,接受三个参数(数据类型的字段)。如果 Haskell 不只是一个接一个地提供参数,您还需要编写 Person ("Brent", 31, Sealingwax)
.
Haskell使用的解析规则实际上比大多数其他语言要简单得多,而且它们允许部分应用非常自然,这真的很有用。例如,
GHCi> map (Person "Brent" 31) [Cabbage, SealingWax]
[Person "Brent" 31 Cabbage, Person "Brent" 31 SealingWax]
使用此代码:
-- Store a person's name, age, and favourite Thing.
data Person = Person String Int Thing
deriving Show
brent :: Person
brent = Person "Brent" 31 SealingWax
stan :: Person
stan = Person "Stan" 94 Cabbage
getAge :: Person -> Int
getAge (Person _ a _) = a
访问斯坦使用的年龄:
getAge stan
打印: 94
定义 stan 不需要括号。
然而 getAge Person "a" 1 Cabbage
导致错误:
<interactive>:60:8:
Couldn't match expected type `Person'
with actual type `String -> Int -> Thing -> Person'
Probable cause: `Person' is applied to too few arguments
In the first argument of `getAge', namely `Person'
In the expression: getAge Person "a" 1 Cabbage
我需要使用括号:
*Main> getAge (Person "a" 1 Cabbage)
1
为什么在这种情况下需要括号?但是定义 stan = Person "Stan" 94 Cabbage
时不需要括号 ?
getAge Person "a" 1 Cabbage
被解析为
(((getAge Person) "a") 1) Cabbage
即这必须是接受 Person
-constructor 和另外三个参数的函数,而不是接受单个 Person
-value[ 的函数=29=].
为什么是 done this way?好吧,它使多参数函数变得更好。例如,Person
本身就是一个函数,接受三个参数(数据类型的字段)。如果 Haskell 不只是一个接一个地提供参数,您还需要编写 Person ("Brent", 31, Sealingwax)
.
Haskell使用的解析规则实际上比大多数其他语言要简单得多,而且它们允许部分应用非常自然,这真的很有用。例如,
GHCi> map (Person "Brent" 31) [Cabbage, SealingWax]
[Person "Brent" 31 Cabbage, Person "Brent" 31 SealingWax]