我一直在使用ml功能,并得到一些恼人的事情。
我将用简单的代码解释它。 例如,如果有一个列表(int * int),我想检查是否有一些元组包含3个第一个元素。
L = [(1,2),(2,3),(3,5),(3,4)]
所以在这个列表中,我想获得5和4。 但是,在ML中,函数是递归的,所以如果我写这样的代码。
fun a(list) =
if #1(hd(list)) = 3 then #2(hd(list))
else a(tl(list))
在这个简单的函数中,它可以得到5而不是4,因为一旦它检测到(3,5)满足条件它返回5并且函数结束。
有没有办法获得4?
答案 0 :(得分:3)
我不知道ml但基本上没有做其他事情你需要这样做:
fun a(list) =
if list = nil then nil
else
if #1(hd(list)) = 3
then
#2(hd(list)) :: a(tl(list))
else
a(tl(list))
(我正在逐步编辑这个回复,因为我对ML了解得更多:)
答案 1 :(得分:3)
您忘记在条件所在的列表尾部递归调用该函数。
在ML中,您几乎从不使用hd
和tl
,而是使用模式匹配。并且您可以在元组上进行模式匹配以获得更多可读性:
fun filter [] = []
| filter ((x, y)::xys) = if x = 3
then y::(filter xys)
else filter xys
List structure上的高阶函数是您想要使用它们的另一种选择。