si的haskell函数

时间:2018-10-13 08:43:07

标签: function haskell figure chess

我试图通过将render

结合使用来编写函数toPosition
render :: Dimensie -> Figure a -> [[a]] 

但是我不知道怎么做。您能提出一种方法吗?

type Figure a = Pos -> a

type Pos = (Double, Double) -- (x, y)

chessboard :: Figure Bool
chessboard (x, y) = even (round x) == even (round y)

type Dimensie = (Int, Int)

render :: Dimensie -> Figure a -> [[a]] 
render  = undefined

toPosition :: Dimensie → (Int, Int) → Pos
toPosition d (x, y) = (fromIntegral x ∗ 2 / b − 1, 1 − fromIntegral y ∗ 2 / h)
        where
           b = fromIntegral (fst d − 1)
           h = fromIntegral (snd d − 1)

当我打电话给

 Figure> render (3,3) chessboard

应该给予

[[True,False,True],[False,True,False],[True,False,True]]

然后,我想通过编写一个函数为某个布尔值给出一个特定字符来进行后续操作。例如,它应显示@的{​​{1}}和True的{​​{1}}

.

但是我该怎么写呢? 我不知道如何在False函数中从boolChar :: Bool -> Char boolChar = undefined 中获得[[Bool]],它不断告诉我[[a]]render,然后它告诉哪条线出了问题。 那么,我该如何为couldn't match expected type ‘a’ with actual type ‘Bool’写什么才能显示要求的结果呢?

1 个答案:

答案 0 :(得分:0)

以下是一些提示:

  • 编写一个函数以生成包含所有坐标的Pos表,即像这样的[[Pos]]

    generateTable (i,j) = [[(1,1),(1,2),...,(1,j)], ..., [(i,1),...,(i,j)]]
    
    • 要解决此问题,您可能需要先编写辅助功能generateRow x j = [(x,1),...,(x,j)],然后使用它来生成每一行
    • 您可以使用递归,也可以使用(可能是嵌套的)列表推导。有很多选择。
  • 拥有table :: [[Pos]]后,您就可以map (map figure) table来获取通缉犯[[a]]

    • 或者,您可以更快地使用figure函数,并避免首先生成配对。