Haskell Лямбда-справка - Разделение терминов из лямбда-терминов - PullRequest
3 голосов
/ 04 мая 2020

Я пытаюсь создать функцию, в которой заданный лямбда-член вернет все отдельные лямбда-термины

Вот моя findT функция:

findT :: T -> [T]
findT (V x) = []
findT (L x n) = [] ++ findT n
findT (A  n m) = [n] ++ findT m

Когда я запускаю эту функцию в двух отдельных тестах, она работает с первым, но не со вторым.

1 Ответ

1 голос
/ 04 мая 2020

Вы можете посмотреть, является ли n значением Variable, и если да, не включать его, например, с помощью:

findTerms :: Term -> [Term]
findTerms (Variable x) = []
findTerms (Lambda x n) = findTerms n
findTerms (Apply <b>(Variable _)</b> m) = findTerms m
findTerms (Apply n m) = n : findTerms m

Здесь, если первый параметр Apply является Variable _, поэтому мы не будем его рассматривать, в противном случае мы выдадим n в списке.

Возможно, вам также следует recurse на n и m, поскольку это может также содержат термины. Для лямбды вы можете вернуть саму лямбду:

findTerms :: Term -> [Term]
findTerms (Variable x) = []
findTerms l@(Lambda _ _) = [l]
findTerms (Apply n m) = findTerms n ++ findTerms m
...