2012-07-27 51 views
1

多個輸出的功能什麼編寫能夠接受不同的輸入的和具有不同的輸出編寫接受多個輸入,並在哈斯克爾

功能的正確方式,例如我使用HMATRIX和 可以說,我想在我的函數中接受矩陣或向量,並且輸出可以是矩陣或向量,具體取決於公式 ,其中以下示例中的T可以是矩陣或向量,可能是正確的工具?

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

更新使用或者低於這裏提到的是一個可能的解決方案

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

回答

2

你既可以看看Either(我知道,這是一個糟糕的玩笑),或者,如果你的函數有一般意思是在不同的數據類型上有不同的實現,你可以定義一個typeclass

編輯:我沒有添加任何進一步的細節,因爲你的問題不完全清楚,我

+0

謝謝你對我以及下面的解決方案罰款! – pyCthon 2012-07-27 15:29:33

-2

另一種解決方案是使用列表[一]列表。基本上,一個向量是一個單行的矩陣。

4

看看如何在HMatrix的source code中實現矩陣乘法和左分頻。

本質上,它們定義了一個多參數類型類,它告訴函數如何針對不同的輸入行爲,並且它有一個函數依賴關係,告訴它哪個輸出是合適的。例如,對於乘法運算:

{-# 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 
1

問題是您想要對輸入做什麼?例如,如果你想要做比較,那麼你可以說輸入必須是一流的奧德這樣的:

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

另一種方法是爲使用,但在這種情況下,你只能有兩個不同的數據類型。例如

myFunc :: Either a b -> Either c d 

可以接受並返回不同的類型。