如何 - 如果这个递归代码?

时间:2017-01-18 21:21:23

标签: haskell maybe

我有一段Haskell代码,用于计算最小二乘回归的代价函数:

cost :: [[Double]] -> [[Double]] -> Double
cost [[]] [[]] = 0
cost ((x:xs):xss) ((y:ys):yss) = (x-y)^2 + cost [xs] [ys] + cost xss yss
cost _ _ = 0

print (cost [[1,2,3],[4,5,6]] [[1,3,3],[4,6,6]]) -- 2.0

这很好用,但现在我希望返回类型为Maybe Double。我怎么能这样做?让我们说最后一个案例cost _ _ = Nothing。对于此处给出的输入,结果应为Just 2.0

1 个答案:

答案 0 :(得分:6)

为空列表添加一个案例,将所有递归调用转换为绑定,并将Updated grid with white . . . . . . . . . . . . . . . . . . . w h i t e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Updated grid with kcalb . . . . . . . . . . . . . . . . . w h k t e . . . . . c . . . . . . . . . a . . . . . . . . . l . . . . . . . . . b . . . . . . . . . . . . . . . . . . . Updated grid with blue . . . . . . . . . . b . . . . . . . w h l t e . . . . . u . . . . . . . . . e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Updated grid with neerg . . . . . . . . b . . . . . . . w n l t e . . . . e u . . . . . . . . e e . . . . . . . . r . . . . . . . . g . . . . . . . . . . . . . . . . . . . 应用于每个等式中的最终结果。因此:

return

然而,案件数量令我担忧。你可以考虑写这样的东西,而不是:

cost :: [[Double]] -> [[Double]] -> Maybe Double
cost [] [] = return 0
cost [[]] [[]] = return 0
cost ((x:xs):xss) ((y:ys):yss) = do
    c  <- cost [xs] [ys]
    c' <- cost xss yss
    return ((x-y)^2 + c + c')
cost _ _ = Nothing

在这里,您不需要import Control.Applicative costBy :: (a -> a -> Maybe Double) -> [a] -> [a] -> Maybe Double costBy f [] [] = return 0 costBy f (x:xs) (y:ys) = liftA2 (+) (f x y) (costBy f xs ys) costBy _ _ _ = Nothing cost' :: [[Double]] -> [[Double]] -> Maybe Double cost' = costBy (costBy (\x y -> return ((x-y)^2))) 恶作剧来重用代码,而是使用多态来在cost [xs] [ys][Double]层获得相同的形状检查行为。更清楚的是,您已经涵盖了所有感兴趣的案例,因为您一次只处理一层列表。