gpt4 book ai didi

clojure - 如何在 Clojure 中扩展数值协议(protocol)

转载 作者:行者123 更新时间:2023-12-04 15:25:11 26 4
gpt4 key购买 nike

我正在尝试使用协议(protocol)来创建工程编号类型(“knumber”),所以我可以说 (+ "1k" "2Meg")得到类似 "2.001Meg" 的东西.我应该能够像这样 (:val my-knumber) 那样从 knumber 中获取浮点值,但通常打印机应该显示字符串,也可以像这样访问 (:string my-knumber) .这个数字将支持所有常用的p、n、u、m、k、Meg、G后缀,并在其中根据需要进行转换,如(/ "1Meg" "1G") -> "1m") .我希望能够将它传递给任何需要数字的函数。

无论如何,有人可以为此提出一个策略吗?我想我需要使用协议(protocol)。我目前有一个 (defrecord knumber [val string])但我不确定接下来会发生什么。

clojure 数字满足哪些协议(protocol)?我想我需要为此扩展一些现有的协议(protocol)/接口(interface)。

谢谢

最佳答案

我认为您的策略应该如下:

  • 定义记录KNumber就像 (defrecord knumber [value unit-map])
  • 制作 unit-map单位到整数指数的映射(如果这些是工程数字,你会想要像 m/s^2 这样的单位,对吧?)。它可能看起来像 {"m" 1 "s" -2} ,
  • KNumber实现java.lang.Number这样您就可以将它与 Clojure 中已经存在的其他数学函数一起使用。您需要实现 doubleValue , longValue
  • 定义协议(protocol)NumberWithUnits您可以扩展到 KNumber s 和正常的clojure 数字。至少它应该有方法(numeric-value [number])(get-units [number])
  • 然后定义你的数学函数+ , * , -等在您自己的命名空间中,对任何实现 NumberWithUnits 的东西进行操作协议(protocol)并返回 KNumber .
  • 关于不同的单位比例(例如“m”与“km”),我建议在单个比例上标准化每种单位类型的内部表示(例如,“m”表示距离),但提供转换为其他单位比例的选项以用于输入/输出目的。
  • 关于clojure - 如何在 Clojure 中扩展数值协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11811271/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com