私は 'real world haskell'の半分で、私の最初のコードを書いています。非常に遠くになっていませんでした...クラスとインスタンスを理解しようとしています
基本的に、リストと数値の計算を行うために、doubleとdoubleリストの配列構文を実装しようと考えていました。 「クラス」はCLOSのジェネリック関数のようなものだと思いますか?私は配列とスカラーを追加するための関数arplusで 'クラス'を作り、それをスカラーのために作った。今私はリストのために同じことをする方法を知らない。 (計算を行うのは簡単ですが、リストバージョンでは「Double」の代わりに何を入れるべきか分かりません)。
class Narray a where
arplus :: a -> a -> a
instance Narray Double where
arplus a b = a + b
次に、どのように混合バージョンを作成しますか?配列スカラ配列とスカラー配列?代わりに
class Narray a where
arplus :: a -> b -> a
:
は、私のようなものが必要でしょうか?
私が書こうとしているコードの例として、以下のsbclコードを参照してください。 (注 - これはlispの配列で行いましたが、私はhaskellのリストでそれをやっていました入力された。実際にも」問題の観点から重要ではありません。)
;; Generic add for arrays and scalar
(defgeneric .+ (a b))
;; Scalar-scalar
(defmethod .+ ((a double-float) (b double-float)) (+ a b))
;; Array-array
(defmethod .+ ((a SB-KERNEL::SIMPLE-ARRAY-DOUBLE-FLOAT)
(b SB-KERNEL::SIMPLE-ARRAY-DOUBLE-FLOAT))
(dotimes (i (array-total-size a))
(setf (row-major-aref a i)
(+ (row-major-aref a i)
(row-major-aref b i)))) a)
;; Array-scaler
(defmethod .+ ((a SB-KERNEL::SIMPLE-ARRAY-DOUBLE-FLOAT) (b double-float))
(dotimes (i (array-total-size a))
(setf (row-major-aref a i)
(+ (row-major-aref a i)
b))) a)
;; Scalar-array
(defmethod .+ ((a double-float) (b SB-KERNEL::SIMPLE-ARRAY-DOUBLE-FLOAT))
(dotimes (i (array-total-size b))
(setf (row-major-aref b i)
(+ a
(row-major-aref b i)))) b)
;; Just to demo the code
(defun indgen (n)
(let ((r (make-array n :element-type 'double-float)))
(dotimes (i n)
(setf (row-major-aref r i) (coerce i 'double-float))) r))
* (load "arrays.lisp")
T
* (.+ (indgen 6) 10d0)
#(10.0d0 11.0d0 12.0d0 13.0d0 14.0d0 15.0d0)
* (.+ (indgen 6) (indgen 6))
#(0.0d0 2.0d0 4.0d0 6.0d0 8.0d0 10.0d0)
*
私はReal World Haskellが、[Learn You A Haskell](http://learnyouahaskell.com/)を使って素材を補完すると、本当にうまく動作することを発見しました。 –
あなたがしようとしていることは、haskellの "あなたが何を意味するか"の哲学とうまくいっていないでしょう。配列配列の追加(zip)は、スカラー配列の追加(マッピング)とは異なる概念です。したがって、2つの別々の演算子が必要になります。現在の規約では、ベクトル引数の側で '^'が使用されます。 '^ + ^'は配列配列、 '+ ^'はスカラ配列です。 – luqui
AFAIK Haskellは複数のタイプのディスパッチをサポートしていないので、 'class Narray a b c where arplus :: a - > b - > c'のように書くことができますが、すべての型を明示的にマークする必要があります。 – adamax