Mam pytanie związane z Data.List i podpisem deleteBy. Idealnie funkcja powinna przyjmować predykat i usuwać pierwszy element, dla którego predykat jest prawdziwy. Coś jak:Dlaczego dane Haskell Data.List.deleteBy przyjmuje funkcję porównania (a -> a -> Bool) i wartość zamiast predykatu (a -> Bool)?
deleteBy :: (a -> Bool) -> [a] -> [a]
deleteBy p = go
where go [] = []
go (x:xs) | p x = xs
| otherwise = x:go xs
Zamiast funkcja zdefiniowana w bibliotece trwa zarówno orzecznik i wartość:
deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy _ _ [] = []
deleteBy eq x (y:ys) = if x `eq` y then ys else y : deleteBy eq x ys
Łatwo zauważyć, że eq
jest zawsze używany z x
jako pierwszy argument i x
jest stała w deleteBy
, więc nie ma powodu, aby uzyskać eq
i x
zamiast eq x
. Z drugiej strony, biorąc predykat pracujący nad jednym elementem, można przekazać predykaty, które nie porównują dwóch wartości, takich jak funkcja działająca na części typu a
lub funkcja trywialna, taka jak cons true
. Moje pytanie brzmi: dlaczego deleteBy
zostało zaimplementowane w ten sposób?
Ważne odpowiedzi: http://stackoverflow.com/questions/9004937/is-there-a-good-reason-why-deleteby-does-not-have-itsa-most-general-type. Spójność z typem '(==)' brzmi jak wiarygodne wyjaśnienie. – duplode
prosty do obejścia (func const) – PyRulez