1
Test-Driven Development with Idrisの第9章には、以下のデータタイプとremoveElem
機能があります。この機能がREPLをハングアップするのはなぜですか?
import Data.Vect
data MyElem : a -> Vect k a -> Type where
MyHere : MyElem x (x :: xs)
MyThere : (later : MyElem x xs) -> MyElem x (y :: xs)
-- I slightly modified the definition of this function from the text.
removeElem : (value : a) -> (xs : Vect (S n) a) -> (prf : MyElem value xs) -> Vect n a
removeElem value (value :: ys) MyHere = ys
removeElem value (y :: ys) (MyThere later) = removeElem value (y :: ys) (MyThere later)
次作品:
*lecture> removeElem 1 [1,2,3] MyHere
[2, 3] : Vect 2 Integer
しかし、以下の呼び出しは、まだ数分後に実行されている:
*lecture> removeElem 2 [1,2,3] (MyThere MyHere)
これはなぜ、私はコンパイルがとても遅い、と仮定しています?
"removeElem'の定義をどうやって修正すればよいかという明確なフォローアップの質問がありますが、あなたが勉強しているので、まず自分自身でそれを見つけ出そうと思っています。 – Cactus
ありがとうございます。 「根拠がない」とはどういう意味ですか? –
私はもともと再帰が十分に確立されていないことを意味しました。しかし、今私はそれについて考えている、おそらくそれはここで使用する間違った用語です... – Cactus