自由モノイドプログラミング言語の作成(Python版 3)
自由モノイドのクラス(2)
自由モノイドのクラスでは、内部でリストを使っているのに __next__ ではイテレーターとして使っていませんでした。これはこうしないと常に同じ値を返すようになっていたためです。
def __init__(self, iterobj: Iterable[T]): self.elements: Iterator[T] = iter(iterobj)
のように self.elements (生成元の有限個または無限個の積を表す)の型を Iterator[T] にすると __next__ は
def __next__(self) -> T: return next(self.elements)
のようにできることがわかりました。リストの場合は iter で変換したものを保持すれば良いようです。
このように前回の記事を修正しました。
この説明を書こうとしたのですが、検索してみると、型チェックはバージョンによって違う場合があるようです。このコードは Python 3.9 で Visual Studio で型チェックを行っています。