我是标准机器学习的新手,并尝试编写以下代码
fun whilestat test stmt1 =
(fn x => if (test x) then (stmt1 x;whilestat test stmt1 ) else (x) );
问题是它给了我以下错误
w.sml:21.6-22.82 Error: right-hand-side of clause doesn't agree with function result type [circularity]
expression: ('Z -> 'Y) -> 'Z -> 'Z
result type: ('Z -> 'Y) -> 'Z
in declaration:
whilestat2 = (fn arg => (fn <pat> => <exp>))
uncaught exception Error
raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
../compiler/TopLevel/interact/evalloop.sml:44.55
../compiler/TopLevel/interact/evalloop.sml:292.17-292.20
我只是想模拟一个 while 条件,如果语句为真则递归,否则返回值。
问题在于返回类型whilestat
。在里面then
分支,你返回一个函数,而在else
分支,你返回返回任意一条数据。我认为当您在递归中递归时您只是忘记传递所有参数then
branch.
这是我的写法(另请注意,不需要使用fn x => ...
,我认为这导致了您的困惑)。
fun whilestat test stmt1 x =
if test x
then (stmt1 x; whilestat test stmt1 x)
else x
将来,您可能会发现在源代码中显式注释类型很有帮助,可以仔细检查您的推理。我通过尝试填写来发现你的错误???
below:
fun whilestat (test : 'a -> bool) (stmt1 : 'a -> unit) : ??? =
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)