Haskell - 更有效的方法来完成算法?

时间:2015-11-18 13:15:50

标签: algorithm haskell

我创建了一个算法,该算法采用非负的Int值,表示总分钟数,并返回一个给出(天,小时,分钟)对应的三元组。

这是我的代码:

calcdays :: Int -> Int
calcdays x = x `div` (24*60)

calchours :: Int -> Int
calchours x = (x - ((calcdays x)*24*60)) `div` 60

calcmins :: Int -> Int
calcmins x = (x - ((calcdays x)*24*60) - ((calchours x)*60))

dayshoursmins :: Int -> (Int,Int,Int)
dayshoursmins x = (calcdays x, calchours x, calcmins x)

只使用基本的Haskell操作(守卫,div,mod等),是否有更简单的方法来编写这个函数?

编辑:

我使用下面的建议使这段代码更简单,虽然不像qoutRem解决方案那么简单,我想我可能会发布它:

calcdays :: Int -> Int
calcdays x = x `div` (24*60)

calchours :: Int -> Int
calchours x = (x `mod` (24*60)) `div` 60

calcmins :: Int -> Int
calcmins x = (x `mod` (24*60)) `mod` 60

dayshoursmins :: Int -> (Int,Int,Int)
dayshoursmins x = (calcdays x, calchours x, calcmins x)

2 个答案:

答案 0 :(得分:12)

我认为有点像这样的想法

dayshoursmins x = (d,hr,mr) where
 (h,mr) = quotRem x 60
 (d,hr) = quotRem h 24

答案 1 :(得分:3)

您可以使用

a `mod` b

直接获得剩余部分。

您可以使用let or where来计算子表达式。