Стандартный ML (с использованием MoscowML) Что не так с этой функцией?(фильтр) - PullRequest
0 голосов
/ 25 октября 2010

Это часть домашнего задания, поэтому моя цель - понять , почему это неправильно.Как я упоминал ранее, я использую 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

(также, если кто-нибудь может дать мне какие-либо советы по расшифровке ошибок выражения типа, которые также могут быть очень полезны.)

Ответы [ 2 ]

1 голос
/ 25 октября 2010

(f L (e::a)) будет работать только в том случае, если f будет функцией карри типа 'a list -> 'a list -> 'a list.Вы должны делать:

if pred e then (f (L, (e::a))) else (f (L,a))

Кстати, SMLNJ жалуется на избыточное совпадение (даются два предложения f ([], a)).

1 голос
/ 25 октября 2010

Вы путаете вызовы функций с корреляцией и карри.Ваше определение f требует кортежа (a, b), но вы передаете ему аргументы как f a b.Попробуйте заменить ваши рекурсивные вызовы на f L ... на f (L,...).

Ошибка типа немного бесполезна, но в основном она говорит, что вы пропускаете список, когда он ожидает 2-х списков списков.

...