实例声明中的变量

时间:2015-05-17 15:09:59

标签: haskell

这个片段来自LYAH:

instance (Eq m) => Eq (Maybe m) where     

Just x == Just y = x == y      
Nothing == Nothing = True     
 _ == _ = False

我对xy应该是什么感到困惑,因为它们没有在任何地方定义。任何人都可以帮我理解这个吗?

2 个答案:

答案 0 :(得分:3)

嗯,(==) (Just x) (Just y) 是一个中缀函数,您可以将其读作匹配模式:

x

在这种情况下,很明显yareBothFive:: 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)