3

そのため、 Data.VectorSpaceを使用しており、 force-layoutを拡張しようとしています。

ここで、多形の「1」スカラーを作成します。つまり、スカラーにベクトルを掛けると、そのベクトルのタイプ(パラメーター)に関係なく、同じベクトルが生成されます。出来ますか?便利な回避策はありますか?

より具体的なコード例を次に示します(ここで使用したコードから継続しています)。

data Particle v = Particle { _pos   :: Point v
                           , _vel   :: v
                           , _force :: v
                           , _mass  :: Scalar v
                           }
-- .. standalone Show and Eq omitted 
initParticle :: AdditiveGroup v => Point v -> Particle v
initParticle p = Particle p zeroV zeroV unitScalar

unitScalar = undefined

-- Should always be true:
testInit :: Point (Double,Double) -> Bool
testInit p = ((_mass (initParticle p)) == 1::Double)

上記の「unitScalar」をどのように定義できますか?

4

1 に答える 1

6

定義したコンテキストでは不可能です。あなたはそれvがであると言うAdditiveGroupので、それが可能であるすべてであり、したがって、追加のプロパティをに帰することはできませんv

もちろん、単位値を定義する追加のクラスを定義できます。

{-# LANGUAGE FlexibleContexts #-}
module Main (main) where

import Data.VectorSpace

数学的に厳密にしたい場合は、おそらく次のようにします。ただし、これはHaskellで望ましくない結果をもたらします。これは、タイプに対して定義できるモノイドが1つしかないため、以下の解決策の方がおそらく優れているためです。

-- BAD SOLUTION! (Arguably)
import Data.Monoid

instance Monoid Double where
  mempty = 1
  mappend = (*)

MultiplicativeGroup代わりに、乗算のモノイドでもある一般を定義します。

class MultiplicativeGroup a where
  unit :: a
  multiply :: a -> a -> a
  reciprocal :: a -> a

instance MultiplicativeGroup Double where
  unit = 1
  multiply = (*)
  reciprocal = (1 /)

これで、実際の例を実装できます。

data Particle v =
  Particle -- Removed Point for this example since I don't have its definition
  { _vel :: v
  , _force :: v
  , _mass :: Scalar v
  }

-- We need VectorSpace because there needs to be a Scalar type associated with v
-- Also, this context requires you to use FlexibleContexts, which should be
-- harmless
initParticle :: (VectorSpace v, MultiplicativeGroup (Scalar v))
             => Particle v
initParticle = Particle zeroV zeroV unit

-- Works as expected:
main :: IO ()
main = print $ ((_mass (initParticle :: Particle Double)) == (1::Double))

ちなみに、もちろん、に置き換えMultiplicativeGroupたり、に置き換えたりすることもできますが、それでは、必要な機能よりもはるかに多くの機能が提供されます。Numunit1

PS。この種のことをより厳密に行う優れたalgebraパッケージを確認する必要があります。その上にフォースソルバーを実装するのはそれほど難しくありません。

于 2012-06-14T19:36:37.860 に答える