Я новичок в Haskell и функционального программирования в целом, так что я не знаю, как сделать этот код идиоматическое:Идиоматические список строительства
type Coord = Double
data Point = Point Coord Coord Coord deriving Show
type Polyline = [Point]
-- Add a point to a polyline
addPoint :: Polyline -> Point -> Polyline
addPoint line p = p:line
line :: Polyline
line = []
constructLine :: Polyline -> Polyline
constructLine line =
let
p1 = Point 2 4 87
p2 = Point 3 7 2
p3 = Point 23 4 8
in addPoint (addPoint (addPoint line p1) p2) p3
main :: IO()
main = do
putStrLn (show (constructLine line))
Моя проблема заключается в функции constructLine
. Если я хочу добавить много точек, то вложенные функции addPoint
будут проблемой. Как я могу это учитывать? И видите ли вы другие вещи, которые можно было бы улучшить?
Предоставить функцию, которая задает список точек, создает полилинию. Например, вы можете использовать 'addPoints line ps = ps ++ line' или что-то в этом роде. BTW: вы также можете вызвать 'addPoint' в нотации infix. – Bakuriu
Идиоматическим способом, вероятно, было бы ditch 'addPoint' и просто построить список непосредственно как' [p3, p2, p1] ', но если вы хотите сохранить этот реферат, просто создайте свой собственный оператор, например' infixr 5 # ' , '(#) :: Point -> Polyline -> Polyline',' (#) = addPoint' (обратите внимание, что я поменял порядок аргументов здесь). Линия 'infixr' важна, убедитесь, что вы ее сохранили, но это означает, что вы могли бы написать это как« p3 # p2 # p1 # line'. Если вы действительно хотите сохранить порядок аргументов, тогда сделайте 'infixl 5 #', и вместо этого он будет написан как 'line # p1 # p2 # p3'. – bheklilr
Обратите внимание, что если вы изменили порядок аргументов так, чтобы это было 'addPoint :: Point -> Polyline -> Polyline', вы можете написать это как' addPoint p3 $ addPoint p2 $ addPoint p1 line', чего может быть достаточно для вашего цели. – bheklilr