私は現在Type-Driven Development with Idrisの本を使っています。 第6章では、サンプルデータストアの設計に関する2つの質問があります。データストアは、コマンドラインアプリケーションで、ユーザーはその中に格納されているデータの種類を設定して新しいデータを追加できます。 ここにコードの関連部分を示します(わずかに簡略化)。あなたはGithubの上full codeを見る
私はIdrisの構文と戦っているようです。 module Test
data Nat = Z | S Nat
Eq Nat where
Z == Z = True
S n1 == S n2 = n1 == n2
_ == _ = False
これは、次のエラー(V1.1.1)で文句を言う: .\.\Test.idr:5:8: error: expected
だが、私はこのようなタイプがあるとしましょう: data Foo = Bar String | Baz | Qux String
私はこのような機能を持つようにしたい:欠落している場合があるように記述したよう get : Foo -> String
get (Bar s) = s
get (Qux s) = s
を、これはコンパイルが、それはトータルではありません;言い換えれば、get
ListsとVectのfind関数に類似した、サイズに制限されたStreamsのストリームに対して、find関数が必要です。 total
find : MaxBound a => (a -> Bool) -> Stream a -> Maybe a
課題は、それを作ることである。 は Nが最大aを符号化するために必要なビット数であるせいぜい 定数 log_2 Nスペースを消費しない合計です。