有一个非常常见的问题在 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)
我在这篇文章中描述了这个问题及其可能的解决方案:https://www.fpcomplete.com/user/k_bx/playing-with-datakinds 在这里,我想问一下,如何使用哪些工具以及什么文档来解决这个问题?
nOne :: JobDescription -> Int
,该函数仅适用于JobOne
。 - Tom EllistaskOneWorker JobTwo
崩溃,所以我只是复制了这个行为。如果你不想它崩溃,你应该使用Prism
。 - Tom Ellis