私は、ManningのIdrisでタイプ駆動開発を行っています。型のファミリで関数を特定の型に制限する方法を教える例を示します。我々はPedal
またはPetrol
のいずれかであるPowerSource
を使用するVehicle
タイプを持っており、ガソリンをその電源として使用する車両についてのみタイプチェックを行うrefill
という関数を書く必要があります。入力タイプと出力タイプを同じにするにはどうすればよいですか?
以下のコードは動作しますが、Car
を補充することはCar
なくBus
を生成することを保証するものではありません。 Car
を指定した場合にCar
を生成し、Bus
を指定した場合はBus
を生成するには、refill
関数のシグネチャを変更する必要がありますか?
data PowerSource
= Pedal
| Petrol
data Vehicle : PowerSource -> Type
where
Bicycle : Vehicle Pedal
Car : (fuel : Nat) -> Vehicle Petrol
Bus : (fuel : Nat) -> Vehicle Petrol
refuel : Vehicle Petrol -> Nat -> Vehicle Petrol
refuel (Car fuel) x = Car (fuel + x)
refuel (Bus fuel) x = Bus (fuel + x)
おかげで、それは、私たちは私たちの財産はconsiceを終了述べることができます!外部の機能のトリックでこのアプローチは本当に素晴らしいです! – Shersh