9

(変なタイトルで申し訳ありませんが、これ以上のタイトルが思いつきませんでした。)

個人的な Haskell プロジェクトでは、「絶対値」(周波数など) と相対値 (2 つの周波数の比率など) の概念が必要です。私のコンテキストでは、2 つの絶対値を加算することは意味がありません。1 つは相対値を加算して新しい相対値を生成し、絶対値に相対値を加算して新しい絶対値を生成することができます (減算についても同様です)。

これらの型クラスを定義しました: 以下を参照してください。ただし、演​​算子##+#+は同様の構造を持っていることに注意してください (および も同様です##-) #-。したがって、これらの演算子をマージして、相対値を加算する単一の加算演算子 (および同様に、相対値になる単一の減算演算子) を使用することをお勧めします。 更新:明確にするために、私の目標は my ##+and#+を単一の演算子に統合することです。私の目標は、これを既存の ( )演算子と統合することではありません。Num+

ただし、型クラスでこれを行う方法がわかりません。

質問:これを行うことはできますか。それとも挑戦しなくていいの?

以下は私が現在持っているものです:

{-# LANGUAGE MultiParamTypeClasses #-}

class Abs a where
  nullPoint :: a

class Rel r where
  zero :: r
  (##+) :: r -> r -> r
  neg :: r -> r

  (##-) :: Rel r => r -> r -> r
  r ##- s = r ##+ neg s

class (Abs a, Rel r) => AbsRel a r where
  (#+) :: a -> r -> a
  (#-) :: a -> a -> r
4

3 に答える 3

10

Torsorと呼ばれる概念を探していると思います。トルソーは、値のセット、差のセット、および値に差を追加する演算子で構成されます。さらに、差異のセットは加算グループを形成する必要があるため、差異も一緒に追加できます。

興味深いことに、胴体はどこにでもあります。一般的な例は次のとおりです。

  • 点とベクトル
  • 日付と日差
  • ファイルと差分

考えられる Haskell の定義の 1 つは次のとおりです。

 class Torsor a where
    type TorsorOf a :: *
    (.-) :: a -> a -> TorsorOf a
    (.+) :: a -> TorsorOf a -> a

以下にいくつかの例を示します。

 instance Torsor UTCTime where
    type TorsorOf UTCTime = NominalDiffTime
    a .- b = diffUTCTime a b 
    a .+ b = addUTCTime b a

 instance Torsor Double where
    type TorsorOf Double = Double
    a .- b = a - b
    a .+ b = a + b

instance Torsor Int where
    type TorsorOf Int = Int
    a .- b = a - b
    a .+ b = a + b

最後のケースでは、トルサーの 2 つのセットが異なるセットである必要がないことに注意してください。これにより、相対的な値を簡単に加算できます。

詳細については、Roman Cheplyakas ブログのより優れた説明を参照してください。

于 2013-04-02T08:36:10.480 に答える
9

何をすべきかを示す2つの回答があります。これは、あなたが求めたことを行う方法を示す別の回答です(これは良い考えではないかもしれません)。:)

class Add a b c | a b -> c where
    (#+) :: a -> b -> c

instance Add AbsTime RelTime AbsTime where
    (#+) = ...
instance Add RelTime RelTime RelTime where
    (#+) = ...

のオーバーロード(#+)により、非常に柔軟になります。柔軟すぎる、IMO。唯一の制約は、結果の型が引数の型によって決定されることです (この FD がないと、何も制約しないため、演算子はほとんど使用できなくなります)。

于 2013-04-02T09:46:43.487 に答える