【发布时间】:2021-11-06 22:39:12
【问题描述】:
我有一个函数,它以(string * (int * int * int)) list * string 作为参数并给出(string * (int * int * int)) list 作为结果。
所以我有一个包含(string * (int * int * int)) 值的列表,我需要在不使用模式匹配的情况下通过string 对其进行过滤。过滤完成后,该函数会给出带有(string * (int * int * int)) 值的过滤列表。
例如它应该像这样工作:
- listCars ( [ ("Samsung", (1,2,3)), ("Hyundai", (3,4,5)), ("Mersedes", (6,1,5))], "Vehicle" );
> val it = [("Hyundai", (3,4,5)), ("Mersedes", (6,1,5))] : (string * (int * int * int)) list
函数本身:
fun listCars ( (lst, type)
: (string * (int * int * int)) list * string)
: (string * (int * int * int)) list =
let
fun f (rez : (string * (int * int * int)) list
, l : (string * (int * int * int)) list)
: (string * (int * int * int)) list =
if whatType (hd (l)) = type then rez @ [hd (l)]
else f (rez, tl (l))
in f ([], lst)
end
但是当我在这个函数上执行上面的例子时
listCars ( [ ("Samsung", (1,2,3)), ("Hyundai", (3,4,5)), ("Mersedes", (6,1,5))], "Vehicle" );
它只给我
> val it = [("Hyundai", (3,4,5))] : (string * (int * int * int)) list
预期输出:
> val it = [("Hyundai", (3,4,5)), ("Mersedes", (6,1,5))] : (string * (int * int * int)) list
所以基本上它不会将所有相应的元素添加到新列表中,我认为我在这一行中做错了:if whatType (hd (l)) = type then rez @ [hd (l)] 当我尝试将相应的元素添加到新列表时。我的错误是什么?
【问题讨论】:
-
“whatType”是怎么做的?作为一个猜测,我认为,你应该调用 f over (rez @ (hd (l))) tl(l)... if whatType (hd (l)) = type then f (rez @ [hd (l) ]) tl(l)... 或类似的东西.. 除非您给出“whatType”的作用,否则我只能猜测...还请详细说明您的预期输出。
-
我从上下文猜测
whatType决定了提供的制造商使用什么类型的产品。 -
为什么不允许模式匹配?通过模式匹配,这将更清晰,更容易推理。
-
@NalinRanjan 它依赖于许多其他函数,所以我认为不需要全部编写它们。基本上它需要
(name, (num1, num2, num2)) : string * (int * int * int)并基于数字返回一个“类型”的参数作为string。使用示例:whatType ("Hyundai", (3,4,5)) = "Vehicle"所以由于数字是(3,4,5),函数告诉我们我们的值是"Vehicle"。希望我的解释足够好 -
@ChrisDutton 是的,您对
whatType的解释是正确的。我不能使用模式匹配,因为我的任务限制了我使用它
标签: sml