Haskell:按属性查找列表中的对象

时间:2017-04-08 14:20:33

标签: haskell pattern-matching

有没有办法通过其中一个属性找到给定的“对象”? 我尝试过模式匹配,就像我在逻辑编程中所做的那样,但我无法弄清楚:

data Object = Object {
    _prop1 :: type,
    _prop2 :: color,
    _prop3 :: pos
} deriving Eq

type Square = Maybe Object
type Board = [[Square]]

objectlist::Board
objectlist = [[ Just (Object type color pos), Just (Object type color pos)]
...
[ Just (Object type color pos), Just (Object type color pos)]

index_of :: (Int, Int)->Int
index_of (x,y) = fromJust $ elemIndex piece objectlist
    where
        piece = Piece _ _ (x,y)

另外,我认为我找到索引的方法并不好。我用一个简单的列表使用它,但无法找到如何使用2 dim列表。

2 个答案:

答案 0 :(得分:1)

您可以使用findIndex获得某种效果。

index_of :: (Int, Int)->Int
index_of (x,y) = fromJust $ findIndex piece objectlist
  where
    piece (Piece _ _ pos) = pos == (x,y)

答案 1 :(得分:1)

正如您在另一个answer中所说的那样,您正在寻找2D列表中的索引。因此,我认为index_of的类型应为(Int, Int) -> (Int, Int)

在另一个答案中建议使用findIndex函数来帮助您index_of。你需要的是它的通用2D版本。您可以通过以下方式实施findIndex2D

import           Data.List
import           Data.Maybe

findIndex2D :: (a -> Bool) -> [[a]] -> Maybe (Int, Int)
findIndex2D pred xs = do
  let maybeIndices = map (findIndex pred) xs
  y <- findIndex isJust maybeIndices
  x <- maybeIndices !! y
  return (x, y)