Functional programming Erlang:涉及不可模式匹配的对象上的用户定义函数的条件

Functional programming Erlang:涉及不可模式匹配的对象上的用户定义函数的条件,functional-programming,erlang,user-defined-functions,Functional Programming,Erlang,User Defined Functions,在Erlang代码中,我使用的是类似于字典的数据结构,它有一个{tag,value}列表。例如:{robot,[{x-pos,50},{y-pos,100},{speed,10}]。无法预测列表中元素的数量或其顺序。我编写了一些函数,可以遍历列表以查找每个参数的值,如get_xpos、get_ypos等 我想写一个函数,它的行为应该是这样的 function(MyTuple) when get_xpos (MyTuple) > 50 -> stop; function(MyTuple

在Erlang代码中,我使用的是类似于字典的数据结构,它有一个{tag,value}列表。例如:{robot,[{x-pos,50},{y-pos,100},{speed,10}]。无法预测列表中元素的数量或其顺序。我编写了一些函数,可以遍历列表以查找每个参数的值,如get_xpos、get_ypos等

我想写一个函数,它的行为应该是这样的

function(MyTuple) when get_xpos (MyTuple) > 50 -> stop;
function(MyTuple) when get_ypos (MyTuple) < 50 -> forward.
获取xpos(MyTuple)>50时的函数(MyTuple)
停止;
函数(MyTuple)在get_ypos(MyTuple)<50->forward时使用。
由于guards或Erlang中不允许使用用户定义的函数,这是不可能的。因为有很多类似的条件,为每种条件编写case语句是不优雅的。有没有更好的方法呢?

您可以这样做:

aux_fun(TupleList) -> fun(get_xpos(TupleList), get_ypos(TupleList)).

fun(XPos, YPos) when XPos > 50 -> stop;
fun(XPos, YPos) when YPos < 50 -> forward.
aux\u-fun(TupleList)->fun(get\u-xpos(TupleList),get\u-ypos(TupleList))。
当XPos>50->停止时的乐趣(XPos、YPO);
当YPO<50->前进时的乐趣(XPos,YPO)。

这两个子句是吗?如果是这样,它们应该用分号分隔,否则就是语法错误。此外,Tuple是一个误导性的变量名。TupleList是一个更好的候选者。
fun
是一个用于定义匿名函数对象的保留字。它不能用作函数的名称。谢谢你的建议。我是tra从Haskell翻译代码并试图降低复杂性,因此出现了错误。对不起,您在
aux_-fun/1
中使用了一个似乎未定义的
fun/3
。感谢您发现了它。修复了。
fun
是一个用于定义匿名函数对象的保留字。它不能用作函数的名称。这是在他的考试中使用的举例来说,这就是我为什么也使用它的原因。有许多函数,比如get_xpos、get_ypos等,在某些情况下,相应的值甚至可能不存在于myTuple中(我将编写处理这种情况的函数)。因此,不可能将它们全部作为参数传递。