2015-11-18 22 views
6

合計の分数を表す負でないInt値をとり、これに対応する(日、時間、分)を与えるトリプルを返すアルゴリズムを作成しました。ここでハスケル - より効率的なアルゴリズムを完了する方法?

は私のコードです:

のみ基本的なHaskellの操作(警備員、divタグ、改造など)を使用して
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) 

、プログラミングのより簡単な方法は、この機能がありますか?

EDIT:

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) 
+4

ようsomethink私はHaskellのを話すことはありませんが、アルゴリズムは、通常、このように書き思う: '、入力を取る60で割り、残りは分の部分で、その結果があります残りを24時間で割ったものが時間部分であり、結果は日部分である。だから、計算を孤立して実行するのではなく連鎖させる必要があります。 – biziclop

+0

はい、しかし、Haskellでは、変数を設定することはできません。そのため、これを達成する方法がわかりません。 –

+1

変数を設定する必要はありません。ただちに結果を次のステップに送ります。私は構文について確信しています。 – biziclop

答えて

12

私はこの

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

私からの大きな+1 - これは正しい方法です。私は 'quotRem'と' divMod'の間に普通の意見を出すつもりでしたが、このケースでは 'quotRem'は実際に私が負の数で期待していることをすると思います! –

+0

ハスケルの初心者として、私は 'quotRem'を知らなかった。これは素晴らしい、ずっと簡単です、ありがとう。 –

+1

divを検索するために[hoogle](https://www.haskell.org/hoogle/)を使用しました。同様の関数は通常一緒にリストされ、[prelude](http://hackage.haskell.org/package/base-4.8.1.0/docs/Prelude.html#v:div)は同じセクションに 'quotRem'をリストアップしています。 –

3

あなたは

を使用することができます。qoutRemソリューションのように単純ではない、私はそれを投稿かもしれないと思っている間

私は、このコードを簡単にするために、次の提案を使用していました

a `mod` b 

残りを直接取得する。

let or whereを使用すると、部分式を計算できます。

関連する問題