NB:以下で定義するタイプは、この質問の目的のための便利な例です。ハスケルで私自身の複素数の定義をロールバックする必要はないと確信しています。(部分)レコードセレクタを「拡張する」方法
私はここに右の専門用語を使用している場合、私は知らないが、以下のセレクタr
が、私は「部分的」レコードセレクタによって何を意味するかのANE例です。
data Complex = Polar { r :: Float, y :: Float }
| Rectangular { x :: Float, y :: Float }
deriving Show
r
には適用できないため「部分的」ですComplex
値;例えば
r $ Polar 3 0
-- 3.0
...しかし、この場合
r $ Rectangular 3 0
-- *** Exception: No match in record selector r
が、しかし、r $ Rectangular x y
ための賢明な定義はつまり、あります:
-- assuming {-# LANGUAGE RecordWildCards #-}
r :: Complex -> Float
r Rectangular { .. } = sqrt $ (x * x) + (y * y)
GHCiのはmultiple declarations of ‘r’
で、r
のこの定義を拒否しますエラー。
を拡張する方法はありますか。任意のComplex
の値に適用できますか?もちろん
、私は
-- assuming {-# LANGUAGE RecordWildCards #-}
modulus :: Complex -> Float
modulus Polar { .. } = r
modulus Rectangular { .. } = sqrt $ (x * x) + (y * y)
のようなものを定義することができることを実現...しかし、私は既存のセレクタr
を拡張することが可能であるかどうかを知りたいです。
あなたは本当にこのユニコード構文に慣れています – luqui