2015-01-12 11 views
5

これはスタイルに関する簡単な質問です。私が使用してきた:HaskellライブラリLinearを使用して、どのようにベクトルをスケーリングしますか?

import Linear 
point = V3 1 2 3 
scaled = fmap (* 2) point 

それとも...

scaled = (* 2) <$> point 

が、これは意図した方法である、またはスカラーオペレータによる適切な乗算はありますか?

+0

['linear'](https://hackage.haskell.org/package/linear-1.16)パッケージは' Data.Linear'をエクスポートしません。使用しているライブラリにリンクできますか? – bheklilr

+0

Woops、それはタイプミスでした。ありがとう。 – MaiaVictor

+0

https://hackage.haskell.org/package/linear-1.20.7/docs/Linear-Vector.html#v:scaled – SwiftsNamesake

答えて

7

あなたはGHCiのを使用している場合は、実際には、あなたはそれが2 :: V3 Intのために何を意味するのか

> point * 2 
V3 2 4 6 

見ることができないことができるようにlinearライブラリは、Num a => Num (V3 a)のインスタンスをエクスポート:

> 2 :: V3 Int 
V3 2 2 2 

ので、実装をfromIntegerV3のようになります

fromInteger n = V3 n' n' n' where n' = fromInteger n 

これは、あなたが

> point + 2 
V3 3 4 5 
> point - 2 
V3 (-1) 0 1 
> abs point 
V3 1 2 3 
> signum point 
V3 1 1 1 
> negate point 
V3 (-1) (-2) (-3) 

V3のようなものを行うことができます意味もFractionalを実装して、あなたが/との共同を使用することができるはずです。あなたのポイントにはFractionalの値が含まれています。しかし、fmapの使用がより一般的であり、あなたはV3 Intは例えば、V3 Stringに変換することができます

> fmap show point 
V3 "1" "2" "3" 

fmap機能を使用すると、任意の制限なしV3 bを取得するためにV3 aにタイプa -> bの機能を適用できます出力タイプに(必然的に)。 fmapを使用するのは間違っているわけではありません。通常の算術演算子を使用する場合ほど読みにくいです。ほとんどのハスケラーはそれを読むのに何の問題もありませんでしたが、fmapは、ほぼすべてのタイプのために現れる非常に一般的なツールです。

+0

ああ。それは扱いにくいです、私はタイプが非常に柔軟であるとは予想せず、 "スケール"機能を探していました。これは完全に意味をなさない。ありがとうございました。 – MaiaVictor

+3

@Viclib:そうですね。それは_some_ senseになりますが、実際には "完全な意味"ではありません。その「Num」インスタンスは数学的にむしろ冒険的です。もちろん、Edwardは自分がやっていることを知っていますが、より良いインターフェースのために[ベクトル空間パッケージ](http://hackage.haskell.org/package/vector-space)をお勧めします。スケーリングは['* ^'](http://hackage.haskell.org/package/vector-space-0.8.7/docs/Data-VectorSpace.html#v:-42--94-)で表示されます。 – leftaroundabout

関連する問題