5

少なくとも一部のMLファミリー言語では、パターンマッチングを実行できるレコードを定義できます(例: http: //learnyouahaskell.com/making-our-own-types-and-typeclasses)。基本的な考え方は、名前付きフィールドを持つレコードタイプ。コンストラクターはそれらのフィールドをパラメーターとして使用して自動的に作成されるため、そのタイプのレコードを作成できます。エクストラクターは、これらのフィールドをパラメーターとして使用して自動的に作成されるため、そのタイプのレコードでパターンマッチングを行うことができます。

Scalaはさらに一歩進んで、レコードに格納されているフィールド、コンストラクターパラメーター、およびエクストラクターパラメーターを互いに分離できるようにします(例:http ://daily-scala.blogspot.com/2009/11/overloaded-unapply.html ) 。この点で、オブジェクト指向プログラミングと関数型プログラミングの両方をサポートするという目標を達成しています。(もちろん、オブジェクト指向言語では、通常、格納されたフィールドとコンストラクターパラメーターを分離できますが、通常はエクストラクターはありません。)

パターンマッチングがあり、そのようなデカップリングを可能にする他の言語はありますか?

そのようなデカップリングの長所と短所について何か書かれていますか?

4

4 に答える 4

9

私はあなたの質問を理解するために必要な背景を100%持っていないことを認めますが、F#には「アクティブパターンdaily-scala」と呼ばれる機能があり、リンクが示すのと同じ機能を構築するために使用できるようです。

それはあなたが探しているものの近くにありますか?

于 2012-05-12T04:46:42.903 に答える
5

いいえ、F#もその機能を提供します。

2番目の記事の例は、部分アクティブパターンを使用して実装できます。

let (|String|_|) = function "s" -> Some "yay" | _ -> None
let (|Int|_|) = function 1 -> Some "hmm" | _ -> None

let (|StringList|_|) = function "x" -> Some [1; 2; 3] | _ -> None
let (|IntList|_|) = function 1 -> Some ["one"; "two"] | _ -> None

match 1 with 
| Int s -> printfn "%O" s 
| _ -> printfn "Unmatched"

match "s" with 
| String s -> printfn "%O" s 
| _ -> printfn "Unmatched"

match "x" with 
| StringList [x; y; z] -> printfn "%O" (x, y, z) 
| _ -> printfn "Unmatched"

match 1 with 
| IntList [x; y] -> printfn "%O" (x, y) 
| _ -> printfn "Unmatched"

アクティブパターンは強力なテクニックであり、再帰的に書くこともできます。パターンマッチングとの組み合わせにより、データを破壊するための便利なツールキットが提供されます。_ただし、パターンマッチングは網羅的ではないため、最後のパターンとしてwildcard()を使用する必要があります。

于 2012-05-12T07:44:55.267 に答える
4

参考までに、Don Syme(F#の発明者)は、F#の「アクティブパターン」に関する論文を書きました。軽量言語拡張による拡張可能なパターンマッチング– Syme、etal。

于 2012-05-14T13:56:48.590 に答える
4

型付き関数型言語のファーストクラスパターンには長い歴史があります。

Haskellの土地では、-XViewPatternsプログラムパターンの拡張機能を使用します。

最初の真のビューパターンは、PhilWadlerの1987年のビューに関する論文にまでさかのぼります。

于 2012-05-14T18:27:00.040 に答える