私はIrdisを初めて利用しています。 HVect
を取り消すことはできますか? HVect [String, Int]
で逆を呼び出すと、HVect [Int, String]
が返され、HVect [String, Int, Day]
で逆に呼び出すとHVect [Day, Int, String]
が返されます。IdrisでHVectを反転させるには?
私はData.Vect.reverse
(Gist)
module reverse_hvect
import Data.HVect
reverse : HVect ts -> HVect (reverse ts)
reverse [] = []
reverse (x::xs) = (reverse xs) ++ [x]
を再利用しようとしたが、私はData.Vect.reverse
は、アキュムレータと内部機能go
を使用しているので、私は同じ構造でVect.reverse
私自身が書いた
Type checking .\reverse_hvect.idr
reverse_hvect.idr:7:9:When checking right hand side of reverse_hvect.reverse with expected type
HVect (reverse (t :: ts))
Type mismatch between
HVect (Data.Vect.reverse, go Type k ts [] ts ++ [t]) (Type of reverse xs ++ [x])
and
HVect (Data.Vect.reverse, go Type (S k) (t :: ts) [t] ts) (Expected type)
Specifically:
Type mismatch between
Data.Vect.reverse, go Type k ts [] ts ++ [t]
and
Data.Vect.reverse, go Type (S k) (t :: ts) [t] ts
Holes: reverse_hvect.reverse
を取得私のHVect.reverse
(Gist)
module reverse_hvect
import Data.Vect
import Data.HVect
myReverse : Vect n a -> Vect n a
myReverse [] = []
myReverse {n = S k} (x::xs) = rewrite plusCommutative 1 k in (myReverse xs) ++ [x]
reverse : HVect ts -> HVect (myReverse ts)
reverse [] = []
reverse (x::xs) = (reverse xs) ++ [x]
が、私は
Type checking .\reverse_hvect.idr
reverse_hvect.idr:12:9:When checking right hand side of reverse_hvect.reverse with expected type
HVect (myReverse (t :: ts))
Type mismatch between
HVect (myReverse ts ++ [t]) (Type of reverse xs ++ [x])
and
HVect (replace (sym (replace (sym (replace (sym (plusZeroRightNeutral k)) Refl)) (replace (sym (plusSuccRightSucc k 0)) Refl))) (myReverse ts ++ [t])) (Expected type)
Specifically:
Type mismatch between
myReverse ts ++ [t]
and
replace (sym (replace (sym (replace (sym (plusZeroRightNeutral k)) Refl)) (replace (sym (plusSuccRightSucc k 0)) Refl))) (myReverse ts ++ [t])
Holes: reverse_hvect.reverse
私はAgdaに精通していません。私は本当にIdrisへの翻訳に感謝します。 – maiermic
「壊れた」とはどういう意味ですか? foldlは使用しませんが、Foldableインターフェイスのfoldlがサイズの変更を取得しないためです。基本的に同じアルゴリズムです。 –
@Edwin Brady、おそらく「壊れた」というのは正しい言葉ではありません。つまり、 'fold'によって' reverse'が定義されている場合、これらの 'plusZeroRightNeutral'と' plusSuccRightSucc'は不要です。 – user3237465