私が次のものを持っているとしましょう:
f (a, b) = if a == 0 then (0, 0) else (a * b, a / b)
x1 = make_strict (0, undefined)
x2 = (0, undefined)
g f :: (b -> b) -> a -> a
どのように定義make_strictし、g:
g f x = ... f x ...
make_strict x = ...
となることによって:
g f x1 == undef
g f x2 == (0, 0)
基本的に、ペアの厳密なバージョンを作成し、必要に応じてラッパーを介して、ペアを取得する関数に渡すことができるようにしますg。ここでの特定の実装fは単なる例であり、ソリューションはそれに依存するべきではありません。ポイントは、私は変えることができないf、私は変えることしかできないということgです。