抽象マシンのシングルステップ削減関数のタイプは何でしょうか? x -> Maybe x
またはx -> x
?ハスケルコードは、抽象的なマシンの1つのステップのredex?
このような単一段階削減関数が与えられた場合、入力項の正規形を与えるマルチステップ削減関数はどのように記述されますか?
抽象マシンのシングルステップ削減関数のタイプは何でしょうか? x -> Maybe x
またはx -> x
?ハスケルコードは、抽象的なマシンの1つのステップのredex?
このような単一段階削減関数が与えられた場合、入力項の正規形を与えるマルチステップ削減関数はどのように記述されますか?
通常、シングルステップリダクション関数のタイプをにします。次に、再入力の場合はJust
、通常の場合はNothing
を返します。これは関数ができるだけ多くの情報を呼び出し元に返すという一般的な原則に従うので、プログラムの再計算を減らすのに役立ちます。
singleStepReduce :: T -> T
であれば、通常の形で、すでにある引数が与えられたときに は、それは2つの選択肢があります。これは、呼び出し元がx == singleStepReduce x
またはisNF x
のような何かを実行して、引数がNFかどうかを判断する必要があります。これは情報singleStepReduce
が既に決定しているので、無駄な計算です。さらに、x == singleStepReduce x
は計算上非常に高価であり、isNF x
は依然としてこの決定を複製する。およびは、基本規則を破棄するためのルールの縮小および規則の削除を基本ソフトウェア工学の原則に違反させる。
undefined
。これは悪いことです。呼び出し元がsingleStepReduce x
を呼び出す前に呼び出し元にisNF x
を使用させ、isNF x
とsingleStepReduce x
の定義には未解決の論理が実装されているという問題を残して、呼び出し元は通常の形式のケースから回復する方法がないことを意味します。、その後、非常に単純です:
multiStepReduce :: (a -> Maybe a) -> a
multiStepReduce r x = case r x of
Nothing -> x
Just y -> multiStepReduce r y
さらに悪いことに、 'x == singleStepReduce x'は' x'が自己ループ遷移を持つとき 'isNF x'と等価ではありません。 – chi
'X'は何ですか?どの抽象機械ですか?ステップは何をすべきか?おそらく両方の型がうまくいくでしょう。おそらく、戻り値でシグナル終端を混ぜるだけです。 – Bergi
'x'が状態の型であると仮定すると、' y'型の引数も必要です。これはあなたを別の状態に移動させるものです。 – chepner
これは機能を減少させます。用語に適用されると、抽象機械の1ステップ実行後に得られた用語を与える。 xが算術およびブール式の言語の用語を表すデータ型であるとします。 – user158083