Это часть домашнего задания, поэтому моя цель - понять , почему это неправильно.Как я упоминал ранее, я использую Moscow ML.
fun filter pred = let
fun f ([], a) = []
| f ([], a) = a
| f (e::L, a) = if pred e then (f L (e::a) ) else (f L a)
in
f
end
Я получаю ошибку:
| f (e::L, a) = if pred e then (f L (e::a) ) else (f L a)
^
Type clash: expression of type
'a list cannot have type
'a list * 'b list
Я перечитывал документацию, и это действительно не помогло,Что я действительно не понимаю, так это откуда б список.В нашем задании мы должны использовать аккумулятор с хвостовой рекурсией.Я считаю, что моя ошибка в том, как фильтр вызывает функцию f.Фильтр принимает предикат в качестве аргумента, а f должен принимать список и аккумулятор, который изначально является пустым списком.
Я пытался вызвать f как: f L [], но в других примерах мы на самом деле этого не делалидолжен вызвать f с его аргументом, и он был как-то передан автоматически.
В любом случае, любая помощь, помогающая понять, в чем заключается моя ошибка, и рекомендации о том, как решить проблему, будет принята с благодарностью.
-aitee
(также, если кто-нибудь может дать мне какие-либо советы по расшифровке ошибок выражения типа, которые также могут быть очень полезны.)