Haskell Лямбда-справка - Создание функции приложения - PullRequest
3 голосов
/ 02 мая 2020

Я пытаюсь создать функцию приложения , которая при задании термина N и списка терминов (X1, ..., Xn) возвращает N (X1, ..., Xn)

Но когда я запускаю свой код, он показывает следующую ошибку:

    * Couldn't match type `Term' with `[Char]'
      Expected type: Var
        Actual type: Term
    * In the first argument of `Lambda', namely `x'
      In the expression: Lambda x (applications v xs)
      In an equation for `applications':
          applications v (x : xs)
            | x == [] = Lambda x v
            | otherwise = Lambda x (applications v xs)
    |
147 |     |otherwise = Lambda x (applications v xs)

Но по какой-то причине моя функция application вызывает эту ошибку, даже если она кажется похожей к моей работе абстракции .

applications :: Term -> [Term] -> Term
applications v [] = v
applications v (x:xs)
    |x == [] = Lambda x v
    |otherwise = Lambda x (applications v xs)     

Буду признателен за любую помощь, поскольку я новичок в этом!

1 Ответ

3 голосов
/ 02 мая 2020

Я предполагаю, что ваш тип Term определен следующим образом:

type Var  = String
data Term = Var Var | Lambda Var Term | App Term Term deriving Show

То есть это приложение захвачено конструктором двоичных данных App.

Теперь обратите внимание, что Ваше определение abstractions можно упростить, отбросив различие в регистре от второго предложения (случай для пустого хвоста уже пойман первым предложением):

abstractions :: Term -> [Var] -> Term
abstractions t []       = t
abstractions t (x : xs) = Lambda x (abstractions t xs)

Где лямбда-абстракции обычно расширяются как как можно дальше вправо, т. е. лямбда-х1. лямбда х2. т = лямбда х1. (лямбда x2. t) , приложение функции обычно ассоциируется слева, т.е. t u1 u2 = (t u1) u2 . Следовательно, простое применение вашей функции applications может быть:

applications :: Term -> [Term] -> Term
applications t []       = t
applications t (u : us) = applications (App t u) us

Например:

> applications (Var "x") [Var "y", Var "z"]
App (App (Var "x") (Var "y")) (Var "z")

Теперь, наконец, abstractions и applications следуют знакомым шаблонам. abstractions можно записать в виде правого сгиба по списку переменных для абстрагирования, а applications можно записать в виде левого сгиба по списку терминов, к которому необходимо применить:

abstractions = foldr Lambda
applications = foldl App
...