1

異なる入力を受け入れ、異なる出力を持つことができる関数を書く正しい方法は何ですか

たとえば、私は hmatrix を使用しており、関数でマトリックスまたはベクトルを受け入れたいとしましょう。出力は、式に応じてマトリックスまたはベクトルにすることができます。以下の例の T は、マトリックスまたはベクトルにすることができます。 、おそらくこれに適したツールですか?

Myfunc ::(Matrix A, Matrix/Vector T) -> Maybe(Matrix/Vector T)

以下のいずれかを使用して更新することは、考えられる解決策の 1 つです。

Myfunc :: Maybe Matrix Double t -> (Either Vector Double a,Matrix Double a) -> Either (Matrix Double T,Vector Double T) 
4

4 に答える 4

4

行列の乗算と左除算がHMatrixのソース コードでどのように実装されているかを見てみましょう。

本質的に、それらは関数に異なる入力に対してどのように動作するかを伝えるマルチパラメーター型クラスを定義し、どの出力が適切かを関数に通知します。たとえば、乗算の場合:

{-# LANGUAGE MultiParamTypeClasses  #-}
{-# LANGUAGE FunctionalDependencies #-}

-- |The class declaration 'Mul a b c' means "an 'a' multiplied by a 'b' returns
--  a 'c'". The functional dependency 'a b -> c' means that once 'a' and 'b' are
--  specified, 'c' is determined.
class Mul a b c | a b -> c where
    -- | Matrix-matrix, matrix-vector, and vector-matrix products.
    (<>)  :: Product t => a t -> b t -> c t

-- |Matrix times matrix is another matrix, implemented using the matrix
--  multiplication function mXm
instance Mul Matrix Matrix Matrix where
    (<>) = mXm

-- |Matrix times vector is a vector. The implementation converts the vector
--  to a matrix and uses the <> instance for matrix/matrix multiplication/
instance Mul Matrix Vector Vector where
    (<>) m v = flatten $ m <> asColumn v

-- |Vector times matrix is a (row) vector.
instance Mul Vector Matrix Vector where
    (<>) v m = flatten $ asRow v <> m
于 2012-07-27T13:48:57.820 に答える
2

あなたはどちらかを見ることができます私は知っています、それは悪い冗談です)、またはあなたの関数が一般的な意味を持っているが、異なるデータ型の異なる実装を持っている場合は、typeclassを定義することができます。

編集:あなたの質問が完全に明確ではないため、これ以上詳細を追加しませんでした

于 2012-07-27T13:43:59.703 に答える
1

問題は、あなたの入力をどうしたいですか?たとえば、比較を行いたい場合、入力は次のようにクラス Ord である必要があると言えます。

myFunc :: (Ord a) => a -> b

もう 1 つの方法は、Either を使用することですが、その場合、2 つの異なるデータ型しか持つことができません。例えば

myFunc :: Either a b -> Either c d

さまざまなタイプを受け入れて返すことができます。

于 2012-07-27T13:49:47.290 に答える
-2

別の解決策は、リストのリスト[[a]]を使用することです。基本的に、ベクトルは単一行の行列です。

于 2012-07-27T13:46:03.763 に答える