Idris をいじり始めたばかりで、いくつかの Haskell マシンにシューホーニングしてみました。
namespace works
data Auto a b = AutoC (a -> (b, Auto a b))
const_auto : b -> Auto a b
const_auto b = AutoC (\_ => (b, const_auto b))
ただし、追加のパラメーターを使用して、モナドとして出力を生成できるように一般化Auto a b
したいと思います。私の直感では、 type が含まれるはずでしたが、タイプチェッカーはそれが一致しないと不平を言います。だから私はそれをもう少しポリモーフィックなままにしてみました:AutoM m a b
m
m
Type -> Type
(Type, Type) -> Type
namespace doesntwork
data AutoM : {x : Type } -> (m : x -> Type) -> (a : Type) -> (b : Type) -> Type where
AutoMC : (a -> m (b, AutoM m a b)) -> AutoM m a b
data Identity a = IdentityC a
Auto : Type -> Type -> Type
Auto = AutoM Identity
これは少なくとも型チェックを行います。しかし、私がしようとすると:
const_auto : Monad m => {m : x -> Type } -> {a : Type} -> b -> AutoM m a b
const_auto b = AutoMC (\_ => return (b, const_auto b))
しかし、それは良くありません:
When elaborating right hand side of Stream.doesntwork.const_auto:
When elaborating an application of function Prelude.Monad.return:
Can't unify
(A, B) (Type of (a, b))
with
(b, AutoM m4 a b) (Expected type)
そして、型エラーの意味がよくわかりません。の定義で がどこにも使用されていないのに、一体なぜ の型(a, b)
が言及されるのでしょうか? 定義自体がすでに間違っている気がしますが、その理由や方法はよくわかりません。a
const_auto
AutoM