最近、私はIdrisの依存型を調べています。しかし、私はIdrisにある非常に迷惑な問題に克服します。タイプシグネチャでプログラムを開始する必要があります。だから問題は、どのように私はIdrisに簡潔なタイプの署名を書くことができますか?私は最後の行をコメントした場合たとえばIdrisのVectに正しい型の署名を書くには?
、
get_member : (store : Vect n String) -> (idx : List (Fin n)) -> (m : Nat ** Vect m (Nat, String))
get_member store idx = Vect.mapMaybe maybe_member (Vect.fromList idx)
where
maybe_member : (x : Fin n) -> Maybe (Nat, String)
-- The below line should be type corrected
-- maybe_member x = Just (Data.Fin.finToNat x, Vect.index x store)
は、コンパイルは上記の機能、 を入力し、チェックしますが、私は表現として最後の行を加えた場合、コンパイルは文句を言うでしょう。
When checking right hand side of VecSort.get_member, maybe_member with expected type
Maybe (Nat, String)
When checking an application of function Data.Vect.index:
Type mismatch between
Vect n1 String (Type of store)
and
Vect n String (Expected type)
Specifically:
Type mismatch between
n1
and
n
しかし、私はラムダ関数としてそれを行う、
get_member : (store : Vect n String) -> (idx : List (Fin n)) -> (m : Nat ** Vect m (Nat, String))
get_member store idx = Vect.mapMaybe (\x => Just (Data.Fin.finToNat x, Vect.index x store)) (Vect.fromList idx)
は、それは同様に型チェックされます。
タイプシグネチャに正しい長さのVectタイプを定義するにはどうすればよいですか?