如何使用公共变量参数清晰地定义包含函数的Haskell模块?
发布时间:2020-12-16 22:58:57 所属栏目:百科 来源:网络整理
导读:我正在尝试编写一个 Haskell模块,它使用库 haxr定义远程XML-RPC API的函数.以下是haxr的文档建议您如何在url上定义一个调用examples.add的Haskell函数: add :: String - Int - Int - IO Intadd url = remote url "examples.add" 像这样叫: server = "http:
我正在尝试编写一个
Haskell模块,它使用库
haxr定义远程XML-RPC API的函数.以下是haxr的文档建议您如何在url上定义一个调用examples.add的Haskell函数:
add :: String -> Int -> Int -> IO Int add url = remote url "examples.add" 像这样叫: server = "http://localhost/~bjorn/cgi-bin/simple_server" add server x y 如果我有一个或两个XML-RPC方法(我不需要一个单独的模块),这对我来说似乎没问题.但是,代码中的服务器重复是一个问题,因为我有近100个函数.我无法在模块中定义服务器,如下所示: someRemote :: Remote someRemote = remote "http://example.com/XMLRPC" add :: Int -> Int -> IO Int add = someRemote "examples.add" 因为如果URL对于使用它的代码是灵活的,则不能对其进行硬编码.我也无法将someRemote定义为函数的参数,因为它具有相同的重复问题. Haxr’s examples没有提供如何解决这个问题的线索. 我通常用命令式OOP语言(即Java,Python)编写程序.如果我使用这些语言,我会定义一个带有构造函数的类,它使用服务器,所有函数都使用对象实例的服务器变量,而不是询问调用代码. 我在Haskell中找到了相同的东西,但我似乎不知道找到它的正确关键字.类型类似乎不是答案.我可以写一个更高阶的函数来返回部分应用的函数,但是解压缩它们会更加丑陋. 解决方法
我不太确定“重复服务器”实际上是那么糟糕.当然,你永远不应该复制一个冗长的文字,但对于一个不会使代码混乱并且易于替换的单个变量名称,这应该不是什么大问题.
但是当然,通过将共享变量附加到您正在使用的monad中,您可以轻松避免这种重复,类似于将其附加到OO类对象的方式.那叫做读者. import Control.Monad.Trans.Reader type RemoteIO = ReaderT String IO -- or perhaps `ReaderT Remote IO` add :: Int -> Int -> RemoteIO Int add x y = do url <- ask lift $remote url "examples.add" x y (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- properties – 确保数组属性的每个元素符合React中的自定义
- 如何在频繁的postgres备份场景中最小化带宽?
- oracle RAC 11g sqlload 生产表导入数据(ORA-12899)
- ruby-on-rails – Postgis纬度/经度读出反转
- c 11 – gcc:切换后如何最好地处理关于(无法到达)功能结束
- ruby-on-rails – 如何访问Rack中间件的特定实例?
- 在绑定的情况下,在postgresql中使用不同的标准对每列进行排
- 如何使用Swift关闭ios中的viewController
- React Native多入口实现
- C#开发微信门户及应用(3) 文本消息和图文消息应答