You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数式编程中用数据表示有副作用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:14:53