编写一个接受多个输入并在haskell中具有多个输出的函数

时间:2012-07-27 13:39:27

标签: haskell

最简单的方法是编写一个可以接受不同输入并具有不同输出的函数

例如我正在使用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) 

3 个答案:

答案 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]]列表。基本上,矢量是一个单行的矩阵。