高阶函数的Clojure类型提示
我正在创建一个小应用程序来学习Clojure,我刚刚为我的代码启用了反射警告功能,我发现了许多可以添加类型提示以丰富代码并提高性能的地方 然而,我在代码中的一些地方得到了警告,我使用了高阶函数或简短的匿名语法符号,我不知道如何在不扩展函数定义的情况下修复这些情况高阶函数的Clojure类型提示,clojure,Clojure,我正在创建一个小应用程序来学习Clojure,我刚刚为我的代码启用了反射警告功能,我发现了许多可以添加类型提示以丰富代码并提高性能的地方 然而,我在代码中的一些地方得到了警告,我使用了高阶函数或简短的匿名语法符号,我不知道如何在不扩展函数定义的情况下修复这些情况 例如,考虑下面的代码: (定义测试java费用) (测试“测试费用” (让[总分(map(memfn金额)费用)] (is(=7406(适用+总分()()()))) 其中,费用是一个向量,包含名为费用的某种类型/类别的对象 似乎投诉是
例如,考虑下面的代码:
(定义测试java费用)
(测试“测试费用”
(让[总分(map(memfn金额)费用)]
(is(=7406(适用+总分()()())))
其中,费用
是一个向量,包含名为费用
的某种类型/类别的对象
似乎投诉是关于amountancents
,Clojure正在对传递的参数进行反思以确定其类型(即费用
)
我可以通过更改(memfn amountments)
来修复警告(fn[^e](.amountments e)),但这只会使我的代码更难阅读,在我看来也不那么优雅
如果我有类似的问题:#(.amountancents%)
使用匿名函数声明的特殊语法
我还考虑使用一个带注释的函数来创建费用对象,该对象的返回类型被标记为其类型,希望稍后可以推断出该类型,如下所示
(定义新费用^expense[日期字符串美元美分类别商户名称]
(费用.日期字符串美元美分类别商户名称))
然后创建我的开支,做:
(定义费用[(新费用“2009-8-24”44 95”书籍“amazon.com”)
(新费用“2009-8-25”29 11“天然气”“壳牌”))
但这也不起作用;编译器仍然无法推断所讨论的向量是费用对象的向量
有没有办法解决上面使用#()
或将函数作为参数传递给高阶函数(例如memfn
)的情况下的反射警告?我的意思是,一种不必自己扩展函数声明的方法(例如,(fn[^Type n]..)
您是否只需要向memfn
调用添加类型提示
从(其中memfn
被描述为(memfn name&args)
):
名称
可以是带有方法接收者名称提示的类型
键入以避免反射呼叫
因此,在您的情况下,您可以使用:
(memfn ^Expense amountInCents)
避免反射。这将教会我如何使用RTFM。这正是我想要的。