1

编写可以接受不同输入并具有不同输出的函数的正确方法是什么

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

您可以看一下Either(我知道,这是个坏笑话),或者,如果您的函数具有一般含义但在不同数据类型上的实现不同,则可以定义一个typeclass

编辑:我没有添加任何进一步的细节,因为你的问题对我来说并不完全清楚

于 2012-07-27T13:43:59.703 回答
1

问题是你想用你的输入做什么?例如,如果您想进行比较,那么您可以说输入必须是 Ord 类,如下所示:

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

另一种方法是使用 Either,但在这种情况下,您只能拥有两种不同的数据类型。例如

myFunc :: Either a b -> Either c d

可以接受和返回不同的类型。

于 2012-07-27T13:49:47.290 回答
-2

另一种解决方案是使用列表列表 [[a]]。本质上,向量是具有单行的矩阵。

于 2012-07-27T13:46:03.763 回答