ArrowLoop
を含む関数インスタンス
loop :: ((b,d) -> (c,d)) -> (b -> c)
loop f b = let (c,d) = f (b,d) in c
まず、署名に問題があります。どうすればb -> c
から取得でき(b,d) -> (c,d)
ますか? つまりc
、結果のタプルの は入力の両方の要素に依存する可能性がありd
ます。
第二に、ここでの仕組みがわかりませんlet
。(c,d) = f (b,d)
の循環定義が含まれていませんd
か? どこd
から来たの?正直なところ、これが有効な構文であることに驚いていますd
。
数学では、これは意味のあることです。たとえば、f は複雑な関数になる可能性がありますが、実数部 b のみを提供し、虚数部 d を選択するときに変化しない方法で選択する必要があります。 f (b,d) を評価すると、ある種の不動点になります。しかし、この類推が成り立つ場合、let
式は何らかの形で d の不動点を「検索」する必要があります (複数存在する可能性があります)。それは私には魔法に近いように見えます。それとも、私は複雑すぎると思いますか?