最简单的方法是编写一个可以接受不同输入并具有不同输出的函数
例如我正在使用hmatrix和 假设我想在我的函数中接受矩阵或向量,输出可以是矩阵或向量,具体取决于hte公式 以下示例中的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)
答案 0 :(得分: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 :(得分:2)
您可以查看Either(我知道,这是一个糟糕的笑话),或者,如果您的函数具有一般含义但在不同数据类型上有不同的实现,则可以定义{{3} }。
编辑:我没有添加任何进一步的细节,因为我的问题并不完全清楚
答案 2 :(得分:-2)
另一种解决方案是使用列表[[a]]列表。基本上,矢量是一个单行的矩阵。