2017-06-03 34 views
0

我正在尝试确定一个有效的移动。此举必须符合两个条件才能成为有效举措。第一个条件是确保我想移动的位置没有已经存在的棋子,第二个条件是确保我在进行此移动时将得分。在haskell中使用警卫时的多个条件

我已经完成了第一个条件的代码,但是我不知道如何在第二个条件下跟随它。也许之所以困难的原因是因为它返回一个Bool,当满足其他条件之一时需要将其设置为True或False。例如

​​

因此,您可以看到,我已经完成了第一个条件的代码,现在我该如何在第二个条件中添加?

喜欢的东西

valid :: Piece -> Pieces -> Bool 
valid p [] = True 
valid p (x:xs) | getPos(p) == getPos(x) = False 
         | otherwise = valid p xs 
         && ... 

不过话又说回来,这个函数将第一条件或是发生故障,或通过停止。这是什么工作?

编辑:声明

data Piece = Piece Position Player 
type Pieces = [Piece] 

编辑:GETPOS

GETPOS是获取一块的位置

回答

4

你可以移动测试空余位置,以一个辅助功能(功能例如vacant),并在valid中编写您的其他条件,如额外的score功能:

valid :: Piece -> Pieces -> Bool 
valid p xs = vacant p xs && score p xs > 0 

vacant :: Piece -> Pieces -> Bool 
vacant p [] = True 
vacant p (x:xs) 
    | getPos p == getPos x = False 
    | otherwise = vacant p xs 

score :: Piece -> Pieces -> Int 
score p xs = error "TODO" 

你也可以使用vacant更简单,避免明确递归:

import Data.List (notElem) 

vacant p xs = getPos p `notElem` map getPos xs 

不过,我猜想,计算得分依赖于一个事实,此举是可能的。所以,你可能会发现,它的推出为,对于具有正分的有效举措测试单一功能这改善并返回一个Maybe:关于score结果

score :: Piece -> Pieces -> Maybe Int 
score p xs 
    | getPos p `notElem` map getPos xs = let 
    computedScore = error "TODO" 
    in if computedScore > 0 
     then Just computedScore 
     else Nothing 

    | otherwise = Nothing 

现在,您可以模式匹配:如果你得到Nothing,那么这个举动无效或者没有得到积极的分数;如果得到Just s,那么此举是有效的,并导致得分s