2017-02-13 24 views
2

私はハスケルを試していますが、どうして私がペアを含むジャストとマッチすることができなかったのだろうと思います。私はこの言語の経験がほとんどなく、私は完全に失われています。ちょうどペアを含むパターンマッチング

f :: Int -> Maybe (Int, [Int]) 
f 100 = Nothing 
f x = Just (x,[x]) 

g :: Int -> Maybe Int 
g x 
| u==Nothing = Nothing 
| u==(Just (r,s)) = Just r 
where 
    u=f x 

このコードで何が問題なのですか。 GHCによると、rsは範囲外です。

+0

スコープの問題はさておき、 '=='を使うと必要ではない 'Eq'制約が導入されます。 – chepner

答えて

6

を使用することができます。

Guardの表現はブール式と似ていますが、バインディングを行うことはできません。 |の前にバインディングを使用します。この場合はxです。

このように動作するソリューションは次のようになります。

g :: Int -> Maybe Int 
g x = case f x of 
    Nothing -> Nothing 
    Just (r,_) -> Just r 
+2

* "ガード式..." *のため。 'g x |ちょうど(r、s)< - u = ... '?ガードにバインド/マッチさせることができます。正しい構文を使用するだけです。 '=='は正しくありません。 – Zeta

+0

@Zeta「PatternGuard」がHaskell2010の時点でデフォルトであることは分かりませんでした。通知ありがとう。私は、Haskell98のケースとあなたの答えがすでに投稿されたために私の答えを残します。 – jeiea

4

ガード式はパターンマッチングを行うことができないのであなたはcase expressions

g :: Int -> Maybe Int 
g x = 
    case f x of 
    Nothing -> Nothing 
    Just (r,s) -> Just r 
7

あなたはガードでパターンマッチをしたい場合は、pattern guardを使用する必要があります:すべての後に

g :: Int -> Maybe Int 
g x 
    | Just (r,_) <- u = Just r 
    | otherwise  = Nothing 
    where 
    u = f x 

を、(==)は通常の関数である、あなたはそれを使用するために、両側の値を必要とします。 rsu == Just (r,s)で認識されていないため、エラーメッセージが表示されます。 fmap:ところで

Maybeを取り、値が関数hためNothingまたはJust (h x)だったとJust x場合Nothingを返すが、それはパターンを形成するので、一般的です。あなたは書くことができます

関連する問題