求解线性方程 - Math.LinearEquationSolver返回IO(Maybe [Rational])

时间:2017-04-02 01:19:47

标签: haskell math

我正在编写一个解决某些数学问题的程序,而Haskell是我迄今为止编写的语言(出于各种原因)。有一次,我需要解决一个线性方程组,然后将结果用于其他方面。如果需要,我可以提供更多详细信息,但最初并不想发疯。

我能找到解决线性方程的最简单方法是使用Math.LinearEquationSolver包中的linearEqSolver模块进行hackage。一切正常,但所有方法(例如solveRationalLinearEqs)的返回类型为IO (Maybe [Rational])。我希望能够将解决方案提供给接受[Rational]的方法。

我知道IO的重点在于你不能把它拿出来放回去,但是我已经足够多年没有写过Haskell了。 #39;忘记了我以前对IO的所有了解。

我应该做一些简单的解释/示例吗?最简单的解决方案是使用其他模块/找到解决方程组的其他方法吗?

修改:我尝试使用HMatrix方法linearSolveLS,但这会返回[Double]类型的列表(并且对于我需要,即使我确实选择了非小数类型),而我更希望返回类型为[Rational](如LinearEquationSolver中所示)。

1 个答案:

答案 0 :(得分:2)

最常用的方法是使用>>=将产生结果的IO操作与程序的其余部分结合起来。

(>>=) :: Monad m => m  a                  -> (a                  -> m  b) -> m  b
(>>=) ::            IO (Maybe [Rational]) -> ((Maybe [Rational]) -> IO a) -> IO a

您可以这样使用它:

(linearEqSolver arg1 arg2 arg3 ... argn) >>= \maybeResult -> case maybeResult of
  Just resultList -> (... :: IO a)
  Nothing -> (... :: IO a)

或者,如果您的其余代码不需要IO,则可以使用fmap或其中缀同义词<$>来映射纯函数而不是{{1}的结果1}}。

linearEqSolver

注意:大多数这些类型的签名只是为了清晰起见,可以推断出来。

您也可以以相同的方式使用theRestOfYourCode :: Maybe [Rational] -> a (theRestOfYourCode <$> (linearEqSolver arg1 arg2 ... argn)) :: IO a Monad实例,但在这种情况下模式匹配更清晰,因为很难在精神上解析使用多个Maybe的表达式一般情况下。