Функция Haskell для Си - PullRequest
       14

Функция Haskell для Си

0 голосов
/ 13 октября 2018

Я пытаюсь написать функцию 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]]

И тогда я хочуследуйте этому, написав функцию, которая дает определенный символ для определенного логического значения.Например, он должен отображать @ для True и . для False

boolChar :: Bool -> Char
boolChar = undefined

Но как мне это написать?Я не понимаю, как получить [[Bool]] из [[a]] в функции render, он постоянно говорит мне, что это couldn't match expected type ‘a’ with actual type ‘Bool’ и что ‘a’ is a rigid type variable bound by the type signature for:, а затем сообщает, в какой строке произошла ошибка.Так что мне написать для render d (x,y) c = ...., чтобы он отображал запрашиваемый результат?

1 Ответ

0 голосов
/ 13 октября 2018

Вот несколько подсказок:

  • Напишите функцию для генерации таблицы 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 раньше и избегать генерации пар в первую очередь.
...