Иногда вы можете избегать скобок с записью записи, иногда с $
, иногда с функциями инфикса, и иногда они в порядке, если не чрезмерны.
Давайте использовать обозначение записи для точек, которые получают тяжелый доступ для координат, но мы оставим только Line
.
data Point = Point {x::Double,y::Double} deriving (Show)
data Line = Line Point Point deriving (Show)
Это определяет x :: Point -> Double
и y :: Point -> Double
.
Там нет такого понятия, как равенство для плавающей точки, но я пойду примерно направо:
accuracy = 0.000000000001
is :: Double -> Double -> Bool
is x y = abs (x - y) < accuracy
я могу использовать это как x point1 `is` x point2
аккуратно избегая в квадратных скобках is (x point1) (x point2)
Когда структура данных не так сильно вложено сопоставлением с образцом, несколько скобок легко читать:
gradient :: Line -> Double
gradient (Line one two) = (y two - y one)/(x two - x one)
Но мы можем пойти на один уровень глубже остроумие hout с использованием чрезмерных скобок из-за функций x
и y
.
asFunction :: Line -> (Double -> Double) -- () for clarity, not necessity
asFunction [email protected](Line point _) = \xx -> gradient l * (xx - x point) + y point
Примечание Я использовал [email protected]
ввести псевдоним для (Line point _)
, чтобы сохранить печатать на машинке справа.
Теперь мы можем использовать функцию инфикса трюк, чтобы избавиться от нескольких более скобок:
onLine :: Line -> Point -> Bool
onLine l p = l `asFunction` x p `is` y p
На правой стороне, вы можете использовать $
, чтобы избавиться от скобок, но вы не можете использовать это слева в сопоставлении с образцом, потому что это функция f $ x = f x
. Например
this (that (the other thing (something other)))
= this $ that $ the other thing $ something other
= this . that . the other thing $ something other
Вы можете удалить скобки вокруг 'show' вытекающих п. Больше вы ничего не можете сделать; в конце концов, как вы отделяете шаблоны аргументов друг от друга без брекетов? –