だが、私はこのようなタイプがあるとしましょう:タイプのコンストラクタのサブセットのみを受け付ける関数を作成するにはどうすればよいですか?
data Foo = Bar String | Baz | Qux String
私はこのような機能を持つようにしたい:欠落している場合があるように記述したよう
get : Foo -> String
get (Bar s) = s
get (Qux s) = s
を、これはコンパイルが、それはトータルではありません;言い換えれば、get Baz
は型チェックされない式ではなく穴のように扱われます。
タイプシグニチャget
のFoo
を、Bar
またはQux
のいずれかにする必要があることを指定するものに置き換えます。 Foo
タイプのこのサブセットを表現するにはどうすればよいですか?
これはまさに私が望むように見えます!あなたは 'OnlyBarAndQux'型の定義のコードについてもう少し説明できますか?私は 'data' ...' where'構文に慣れていません。 –
考えられるのは、Bar sまたはQux sであるFooの値を与えることによってのみ構築できる(コンストラクタはwhere句の後ろにある)型を記述することです。 OnlyBarAndQuxは従属型です(Fooの値によって異なります)。したがって、タイプOnlyBarAndQux Bazを書くことは完全に合法ですが、それを構築することは不可能です。これがauto prf構造体で使用されているものです。 詳細については、idrisチュートリアルとタイプドリブン開発ブックを参照してください。 – Markus