这个片段来自LYAH:
instance (Eq m) => Eq (Maybe m) where
Just x == Just y = x == y
Nothing == Nothing = True
_ == _ = False
我对x
和y
应该是什么感到困惑,因为它们没有在任何地方定义。任何人都可以帮我理解这个吗?
答案 0 :(得分:3)
嗯,(==) (Just x) (Just y)
是一个中缀函数,您可以将其读作匹配模式:
x
在这种情况下,很明显y
和areBothFive:: Int -> Int -> Bool
5 `areBothFive` 5 = True
x `areBothFive` y = False -- the x and y are variables in the pattern match here
areBothFive 5 5 -- true
areBothFive 4 5 -- false
是模式匹配中的函数参数。
可以显示一个更简单的示例(没有类型类):
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
int main(){
int say=0,i;
char line[250];
gets(line);
int k = strlen(line);
for(i=0; i<k; i++){
if(line[i]=='.' || line[i]=='?' || line[i]=='!'){
say++;
}
}
printf("%d\n",say);
return 0;
}
这是a fiddle illustrating the issue。
LYAH在“函数中的语法”一章中使用了这种语法给出了一个例子。
答案 1 :(得分:2)
他们在那里deconstruct the pattern Just _
- 所以:
let (Just x) = Just 5
会给您x <- 5
let (Just x) = Nothing
将匹配(并通过另一个案例 - 这里将是_ == _
let
就在那里,你可以在 GHCi 中试试这个:
> let (Just x) = Just 5
> x
5
> let (Just x) = Nothing
> x
*** Exception: <interactive>:4:5-22: Irrefutable pattern failed for pattern (Just x)