4

パターンマッチングについて質問があります。

どういうわけか(string ++ [char] ++ anotherstring)と一致させることは可能ですか?

私は次のようなことを試しました:

f (s++";"++r) = s++r (the rhs is trivial, but its just for testing ;))

ただし、これにより解析エラーが発生します。

4

4 に答える 4

9

いいえ、できません。パターンマッチングは、構築されたコンストラクターに従って値を分解するため、パターンマッチングでコンストラクターアプリケーションを使用して、パターンに一致する値と一致しない値を記述することしかできません。

あなたの例のようなものでは、caseうまくいきます、

f str = case break (== ';') str of
          (s, _:r) -> s ++ r
          _        -> error "No semicolon found"
于 2012-10-24T18:52:29.273 に答える
4

完全を期すために、GHCのViewPatterns拡張機能を無償で使用し、DanielFischerの例を次のように書き直すことができます。

{-# LANGUAGE ViewPatterns #-}

f (break (== ';') -> (s, _:r)) = s ++ r
f _ = error "No semicolon found"

もちろん、これは純粋に表面的な変更ですが、case式ではなく通常の「方程式のグループ」構文を使用したい場合は、それがあります。

NB-私は現在GHCを手元に持っていないので、実際に上記をテストしていません。

于 2012-10-24T19:08:39.237 に答える
1

いいえ、できません。あなたがやろうとしていることを達成するためにあなたが使うことができる分割された多くの機能があります。

于 2012-10-24T18:58:34.907 に答える
1

ここで提案されている方法と同様に、この種のパターンマッチングを実行できます。

Haskellパターンマッチングの難問

于 2012-10-24T20:39:51.077 に答える