用函数替换Haskell记录有什么好处

mb1*_*b14 4 haskell data-structures

我正在阅读这篇关于延续的有趣文章,我发现了这个聪明的伎俩.在我自然会使用记录的地方,作者使用一个以和类型作为第一个参数的函数.

例如,而不是这样做

data Processor = Processor { processString :: String -> IO ()
                           , processInt :: Int -> IO ()
                           }


processor = Processor (\s -> print $ "Hello "++ s)
                      (\x -> print $ "value" ++ (show x))
Run Code Online (Sandbox Code Playgroud)

我们做得到:

data Arg = ArgString String | ArgInt Int
processor :: Arg -> IO ()
processor (ArgString s) = print "Hello" ++ s
processor (ArgInt x) = print "value" ++ (show x)
Run Code Online (Sandbox Code Playgroud)

除了聪明之外,它对简单记录有什么好处?这是一种常见的模式吗?它有名字吗?

lef*_*out 6

嗯,这只是一个简单的同构.在ADT代数中:

IO()String× IO()IntIO()String+Int

RHS的明显好处可能是它只包含IO()一次 - DRY FTW.