haskell ADT中的类型安全命名字段

Kos*_*kov 8 haskell

有一个很常见的问题很容易与haskell有关.描述它的代码段是这样的:

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)
Run Code Online (Sandbox Code Playgroud)

我描述了这个问题,这篇文章中可能有解决方案:https://www.fpcomplete.com/user/k_bx/playing-with-datakinds

在这里,在StackOverflow上,我想问你 - 这个问题的最佳解决方案是什么,使用哪些工具和哪些文档?

goi*_*ain -1

是的; 使用像你这样的镜头并将“n”事物抽象为某种“JobData”对我来说似乎还不错(甚至可能很好。)