私はデータ型を持っています
data N a = N a [N a]
バラの木と Applicative インスタンスの
instance Applicative N where
pure a = N a (repeat (pure a))
(N f xs) <*> (N a ys) = N (f a) (zipWith (<*>) xs ys)
適用法を証明する必要があります。ただし、pureは無限に深く、無限に分岐するツリーを作成します。したがって、たとえば、準同型の法則を証明する際に、
pure f <*> pure a = pure (f a)
等式の証明だと思った
zipWith (<*>) (repeat (pure f)) (repeat (pure a)) = repeat (pure (f a))
近似(またはテイク)によって補題が機能します。しかし、私の試みは、帰納的なステップで「悪循環」につながります。特に、削減
approx (n + 1) (zipWith (<*>) (repeat (pure f)) (repeat (pure a))
与える
(pure f <*> pure a) : approx n (repeat (pure (f a)))
ここで、approxは近似関数です。明示的な帰納的証明なしに、どうすれば等しいことを証明できますか?