Похоже, вы хотите go просмотреть список ShipPoints
и удалить Point
из каждого ShipPoints
, где он появляется. Это можно сделать с помощью map
:
removePointFromShipList :: Point -> [ShipPoints] -> [ShipPoints]
removePointFromShipList p lst = map (removePointFromShip p) lst
. Используется вспомогательная функция:
removePointFromShip :: Point -> ShipPoints -> ShipPoints
, которая удаляет Point
из указанного c ShipPoints
. Эта вспомогательная функция может быть определена с помощью фильтра:
removePointFromShip p shp = filter (/= p) shp
Я думаю, что вышеупомянутые функции просты и не нуждаются в улучшении, но поскольку Haskell программисты не могут уйти хорошо Достаточно в одиночку, большинство (в том числе и я) попытаются изменить это. Не стесняйтесь игнорировать эту часть или просто просмотреть ее ради развлечения.
В любом случае, многие Haskellers переместят функцию removePointFromShip
в предложение where
и, возможно, сократят имена:
removePoint :: Point -> [ShipPoints] -> [ShipPoints]
removePoint p lst = map removePoint' lst
where removePoint' shp = filter (/= p) shp
Тогда многие люди поймут, что если у вас есть f x = blah blah blah x
, вы можете заменить это на f = blah blah blah
(процесс, известный как eta-Reduction). Обе основные и вспомогательные функции могут быть сокращены на eta следующим образом:
removePoint :: Point -> [ShipPoints] -> [ShipPoints]
removePoint p = map removePoint'
where removePoint' = filter (/= p)
Теперь нет смысла иметь предложение where
так:
removePoint :: Point -> [ShipPoints] -> [ShipPoints]
removePoint p = map (filter (/= p))
Это очень хорошо и большинство людей остановится здесь. По-настоящему сумасшедший признал бы возможность превратить это в «бессмысленную» форму, написав:
removePoint :: Point -> [ShipPoints] -> [ShipPoints]
removePoint = map . filter . (/=)
(Технически, это не идентично предыдущей версии, но это нормально, пока p /= q
всегда совпадает с q /= p
.) Теперь это выглядит действительно умно, но никто не может понять это, просто взглянув на него, поэтому мы должны добавить комментарий:
-- Remove Point everywhere it appears in [ShipPoints]
removePoint :: Point -> [ShipPoints] -> [ShipPoints]
removePoint = map . filter . (/=)
Удивительно!