Существует очень распространенная проблема, с которой очень легко попасть в haskell. Code-фрагмент, который описывает его так:Типовые поля с именами в haskell ADTs
data JobDescription = JobOne { n :: Int }
| JobTwo
| JobThree { n :: Int }
deriving (Show, Eq)
taskOneWorker :: JobDescription -> IO()
taskOneWorker t = do
putStrLn $ "n: " ++ (show $ n t)
main :: IO()
main = do
-- this runs ok:
taskOneWorker (JobOne 10)
-- this fails at runtime:
-- taskOneWorker JobTwo
-- this works, but we didn't want it to:
-- taskOneWorker (JobThree 10)
Я описал эту проблему, и это возможные решения в этой статье: https://www.fpcomplete.com/user/k_bx/playing-with-datakinds
Здесь, на StackOverflow, я хотел бы спросить вас - каковы наилучшие решения этой проблемы, используя какие инструменты и какую документацию?
IMO, единственная проблема заключается в том, что Haskell позволяет объявлять полевые аксесуары вообще в многопользовательском ADT. Я считаю, что злоупотребление синтаксисом записей, просто не делайте этого, и проблем нет. – leftaroundabout
@leftaroundabout конечно. Проблема с моим производственным кодом, который у меня есть, заключается в том, что полевые аксессуры уже существуют и используются повсеместно. Поэтому я хочу продолжить использование полевых аксессуаров (чтобы не делать сумасшедшего рефакторинга), но все равно получить безопасность по типу. –
Просто определите новую функцию 'nOne :: JobDescription -> Int', которая работает только для' JobOne'. –