我是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
答案 0 :(得分:2)
因为在Haskell中,else
不是if
表达式的可选部分,所以您需要将diff1
定义为diff1 = if d1 > a1 then d1 - a1 else 0
。其他两个是相似的。
请注意>
会返回Bool
值,因此您可以将这三个差异加起来并将其与c
进行比较,并将其用作您的条件。
有几种方法可以定义此功能:
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