Haskell程序简单的游戏

时间:2014-04-26 12:45:54

标签: function haskell

我是haskell编程的新手。我尝试编写一个简单的骰子游戏,但我不知道在haskell中这样做。

 suc :: (Int,Int,Int) -> Int -> (Int,Int,Int) -> Bool

 suc  (a₁,a₂,a₃) c (d₁,d₂,d₃)

如果(d1-a1)+(d2-a2)+(d3-a3)大于c,我想考虑每个差dᵢ-aᵢ(但不是aᵢ>dᵢ)并返回False。 (如果aᵢ>dᵢ,那么我总结0而不是差异)

我尝试这样的事情:

suc :: (Int,Int,Int) -> Int -> (Int,Int,Int) -> Bool
suc (a1, a2, a3) c (d1, d2, d3) = ?????
    where diff1 = if (d1 > a1) then d1-a1       
          diff2 = if (d2 > a2) then d2-a2
          diff3 = if (d3 > a3) then d3-a3

2 个答案:

答案 0 :(得分:2)

  1. 因为在Haskell中,else不是if表达式的可选部分,所以您需要将diff1定义为diff1 = if d1 > a1 then d1 - a1 else 0。其他两个是相似的。

  2. 请注意>会返回Bool值,因此您可以将这三个差异加起来并将其与c进行比较,并将其用作您的条件。


  3. 有几种方法可以定义此功能:

    suc1 (a1, a2, a3) c (d1, d2, d3) = diff1 + diff2 + diff3 <= c
        where diff1 = if d1 > a1 then d1 - a1 else 0
              diff2 = if d2 > a2 then d2 - a2 else 0
              diff3 = if d3 > a3 then d3 - a3 else 0
    
    suc2 (a1, a2, a3) c (d1, d2, d3) = sum diffs <= c
        where diff1 = max (d1-a1) 0
              diff2 = max (d2-a2) 0
              diff3 = max (d3-a3) 0
              diffs = [diff1, diff2, diff3]
    
    suc3 (a1, a2, a3) c (d1, d2, d3) = sum (zipWith diff as ds) <= c
        where diff a d = max (d-a) 0
              as = [a1, a2, a3]
              ds = [d1, d2, d3]
    

答案 1 :(得分:1)

这个怎么样?

suc :: (Int,Int,Int) -> Int -> (Int,Int,Int) -> Bool
suc (a1, a2, a3) c (d1, d2, d3) = 
    ((if a1> d1 then 0 else d1-a1) + (if a2> d2 then 0 else d2-a2) + (if a3>d3 then 0 else d3-a3) > c )

或者

suc :: (Int,Int,Int) -> Int -> (Int,Int,Int) -> Bool
suc (a1, a2, a3) c (d1, d2, d3) = 
    max 0 (d1-a1) + max 0 (d2-a2) + max 0 (d3-a3) > c