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)
除了聪明之外,它对简单记录有什么好处?这是一种常见的模式吗?它有名字吗?
嗯,这只是一个简单的同构.在ADT代数中:
IO()String× IO()Int
≅ IO()String+Int
RHS的明显好处可能是它只包含IO()一次 - DRY FTW.