函数式编程中用数据表示有副作用API的设计模式名称是什么?
这种用数据表示副作用API的模式名称
这种模式最常用的名称是命令模式(Command Pattern),在函数式编程语境下,它核心是将副作用的描述与实际执行完全分离。以你给出的FizzBuzz示例为例:
data Command = PutStrLn String fizz :: Int -> Command fizz n | n `mod` 15 == 0 = PutStrLn "FizzBuzz" | n `mod` 3 == 0 = PutStrLn "Fizz" | n `mod` 5 == 0 = PutStrLn "Buzz" | otherwise = PutStrLn (show n) runCommand :: Command -> IO () runCommand (PutStrLn str) = putStrLn str main :: IO () main = mapM_ runCommand $ map fizz [1..100]
这里的核心逻辑拆分很清晰:
fizz作为纯业务逻辑函数,只生成Command类型的数据——这些值只是“要打印什么内容”的纯描述,完全不涉及IO副作用;runCommand是专门的解释器,负责把Command数据转换成实际的IO操作;main作为程序的外层入口,将纯逻辑生成的操作描述传递给解释器执行。
这种模式的优势在于:业务逻辑保持纯函数特性(易于测试、推理和复用),副作用被严格隔离到解释层,甚至可以为同一套操作描述编写多个解释器——比如写一个用于测试的解释器,不执行实际打印,而是收集所有要输出的内容用于断言验证。
如果需要处理更复杂的操作组合(比如顺序执行、条件分支、嵌套操作),这个基础模式可以扩展为**自由Monad(Free Monad)或代数效应(Algebraic Effects)**的实现,但你给出的示例是命令模式最简洁的函数式变体。
内容的提问来源于stack exchange,提问作者Rasmus Källqvist
相关产品推荐
相关产品推荐

