コンストラクタの逆の関数の適切な用語は何ですか?データ型から値をラップ解除するには?


13

編集:私は質問を少し言い換えています。デストラクタという用語がOOPでまったく異なる何かに使用されていることに気づかなかったため、どうやら混乱が生じたようです。これは、オブジェクトが破棄されるときに呼び出される関数です。関数型プログラミングでは、可変状態を回避しようとするため、それに相当するものはありません。(質問に適切なタグを追加しました。)

代わりに、値をアンラップするためのレコードフィールド(特にnewtypes などの単一値のデータ型の場合)がdestructorまたはdeconstructorと呼ばれることもあります。たとえば、(Haskellで)次のようにします:

newtype Wrap = Wrap { unwrap :: Int }

ここWrapにコンストラクタがあり、それunwrapは何ですか?

質問は次のとおりです。

  • unwrap関数型プログラミングをどのように呼び出すのですか?解体者?デストラクタ?それとも他の言葉で?
  • そして、明確にするために、この/他の用語は他の関数型言語に適用できますか、それともHaskellだけで使用されますか?
  • おそらく、これには一般的に、非機能的な言語での用語はありますか?

私は両方の用語を見ました、例えば:

...ほとんどの場合、スマートコンストラクターとデストラクタを提供して、これらを簡単に操作できるようにします。...

で、Haskellのウィキ、または

...ここでの一般的なテーマは、コンストラクターとコンストラクターのペアを融合することです...

で、Haskellのwikibook(ここではそれはおそらく、もう少し一般的な意味でのものです)、または

newtype DList a = DL { unDL :: [a] -> [a] }

unDL関数はdeconstructorで、DLコンストラクターを削除します。...

実世界ハスケル


3
デストラクタは最も広く使用されている用語のようです
ザビオール

3
これはHaskellに特化されているようです(Haskellの「デストラクタ」はC ++と同じ概念ではありません。名前の類似性は誤解を招きます)。「値をアンラップする」という一般的な概念が必要な場合は、おそらくHaskellを例として使用しないでください。C ++ライクな言語では、そのような「アンラッパー」は単なるゲッターかもしれません!
アンドレスF.

1
私は:)あなたが、質問から単語「デストラクタ」を取り除く代わりに「unwrapper」の使用、および言語間でこのパターンの一般的な名前があるかどうかを尋ねる示唆
アンドレス・F.

1
.unapply、または「エクストラクター」はscalaの大まかなアナログですが、ほとんどの場合、単純にパターンマッチ
Gene T

回答:


5

この概念にはいくつかの用語があります。解体は、Haskell界では一般的であると私が信じているものであり、実世界のHaskellがそれを呼ぶものです。破壊(またはバインドの破壊)という用語は、Lispサークルでは一般的だと思います。


1
同じことは、次の1つの言語から別の用語を取得し、C#での選択に地図ターンのように、Haskellは倍のlisp / javaは削減し、ルビーは注入を持っていた、HaskellはバインドScalaはflatmap C#selectmanyを持っていたかは興味深い
ジミー・ホッファ

実際、Haskell界では脱構築と呼ばれています。奇妙に聞こえる場合は、Haskellにはオブジェクトがなく、値だけであることに注意してください。したがって、この用語の意味が異なることは言うまでもありません。大部分は、「解体」がまさにそれがすることです。そのことについて、私は個人的に、オブジェクトの解体者はオブジェクト処理者の線に沿って何かと呼ばれるべきだと思います。はるかに正確です。
MasterMastic 14年

8

デストラクタとは、C ++およびおそらく知らない他の言語で使用される用語です。それらは、コンストラクターによって作成されたリソースを解放するために使用されるため、その正反対を行います。概念は文字通りHaskellに翻訳されていないかもしれませんが、この用語はいくつかの場所で使用されているようです。

編集:質問に対するあなたの編集を考慮して、それをアンラッパーと呼びます...私は元の質問に答えることができましたが、今では私の知識から追い出されているので、この編集をあまり真剣に受け止めないでください。


1
C ++ / C#/ Javaの「デストラクタ」という用語の使用は、Haskellの用語と一致しないことに注意してください。同じ言葉、異なる概念。
アンドレスF.

1
@AndresF。はい、だからこそ文を追加しました:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset

1
結構です、私は下票を削除しました。間違っているのは実際の質問であり、ある質問をしているように見えますが、実際には別の質問をしていると思います!:)
アンドレスF.

@AndresF。はい、質問は誤解を招きます。OPは尋ねる:What's the proper term for a function inverse to a constructor?。質問がいくつかのHaskellコンセプトにより具体的になるように編集されていない限り、答えはそのままにします。
マルコ・fiset

1
C#にはファイナライザがありますが、デストラクタはありません。ファイナライザには非決定的な実行があるため、デストラクタは異なります。したがって、C#でデストラクタの誤った名称を広めないように回答を編集してください。
ジミーホファ

6

OOPでは、コンストラクターは新しいオブジェクトを作成および初期化する関数または言語構成体(オブジェクトを「構築する」)であり、デストラクターはそのデュアル、オブジェクトまたはリソースを解放することによってクリーンアップする関数または言語構成体です保持)削除します。

ただし、Haskellは(たとえばC ++とは異なり)ガベージコレクションを持ち、可変状態またはその他の副作用を(少なくとも直接ではなく)サポートしていないため、OOPの意味でのデストラクタ概念の理由はまったくありません。また、Haskellコンストラクターは、OOPコンストラクターとは異なり、単なるオブジェクト作成よりも多くのアプリケーションを持っています。また、パターンマッチングでも頻繁に使用されます(例については以下を参照)。

あなたのコード例では、「アンラップ」はレコードフィールドであり、その使用方法に応じて、アクセサー、またはゲッターと呼ぶこともあります(後者はレンズコンテキストでも使用されるため、実際には少し混乱します)。

Haskellの文脈で使用される「デストラクタ」(または「デコンストラクタ」)という言葉を自分で聞いたことがありません。しかし、Andres F.が指摘しているように、コンストラクターによって導入されたラッピングを元に戻す関数を参照するために使用されることがあります。私の理解では、レコードゲッターはデストラクタとして機能する可能性がありますが、より複雑なデータ型から値を取得すれば、通常の機能も機能します。例にはmaybeeitherプレリュードから。

unwrapあなたの例では、いくつかのことができることに注意してください:

  • 関数(他の関数と同様):たとえば、doを実行できmap unwrap [ Wrap 23, Wrap 42 ]ます。この使用法は、OOPのgetterメソッドとほぼ同等です。
  • レコード構造内のレコードフィールド指定子: let w = Wrap { unwrap = 23 }
  • レコード更新のレコードフィールド指定子: let w' = w { unwrap = 23 } ; これは、OOPのセッターメソッドに似ています(多くの場合、絞ります)。
  • パターンマッチングのレコードフィールド指定子: f Wrap { unwrap = a } = a

Haskellコンストラクターは、OOPコンストラクターとはまったく異なるものと考えるのがおそらく最善です。Haskellプログラミング言語の良い本をよりよく理解するために(再)読むことをお勧めします- 「Real World Haskell」は本当に良いですし、「Learn You A Haskell」について良いことを聞いたことがあります。両方とも、コンストラクターとレコード構文についての適切な説明が必要です。


2
Haskellのコミュニティでの用語「デストラクタ」の使用の証拠:haskell.org/pipermail/beginners/2010-April/003946.htmlmail-archive.com/haskell-cafe@haskell.org/msg26463.html。Haskellの用語の「デストラクタ」は「アンラッパー」であり、メモリ管理やオブジェクトのファイナライズとはまったく関係のない概念です。
アンドレスF.

3
Haskellのみでプログラムを行う私の論文ディレクターも、アンラッパーに「デストラクタ」という用語を使用しています。
アンドレスF.

まあ、私は学期に出くわしたことがなかった。使用する場合、OOPのデストラクタの概念とはまったく関係がないことは間違いありません。
tdammers

@AndresF .:発言を尊重するために編集。
tdammers

@AndresF。これはデストラクタと呼ばれることも聞いたことがないので興味深いです。それは別にして、レコードフィールドと呼ぶのも正確ではないでしょう。 ?あなたの試合がリストを引き離しているとき、それは「破壊」と呼ばれることを理解しています。これはおそらく関連する用語ですが、ADTを参照していますか?すべてのリストを構造化代入した後、ちょうどそのようADTに作用していることは、私はより長期的な破壊得たもののリストが..ですだstackoverflow.com/questions/11677806/...
ジミー・ホッファ

2

デストラクタはより広い用語だと思います。JavaやVB.NETなどの一部の言語にはファイナライザーがあります。 /programming/171952/is-there-a-destructor-for-java


C ++のような言語のデストラクタは、割り当てられたメモリを解放する前にクリーンアップアクションを実行します。Haskellのデストラクタは、「外側の層」から値をラップ解除します(クリーンアップには使用しません)。それらは真に関連する概念ではありません。
アンドレスF.

2
これがHaskelの質問だとは気づかなかったと思います。
JeffO

確かにはっきりしませんでした。質問は、タグ付けし直され、再定式化されました:)
Andres F.

2

言語間の慣習はないようですので、私は通常それらをextractorsと呼びます。これはScalaがその一般的な概念に使用する用語であり、既存の使用法と混同される可能性が低いためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.