Кратко:Это вопрос из прошлого экзамена Miranda, но синтаксис очень похож на Haskell.
Вопрос:Каков тип следующего выражения и что оно делает? (Определения функций length и swap приведены ниже ).
(foldr (+) 0). (foldr ((:). length. (swap (:) [] )) [])
length [] = 0
length (x:xs) = 1 + length xs
swap f x y = f y x
Примечание:
Пожалуйста, не стесняйтесь отвечать в синтаксисе haskell -извините за использование звездочек в качестве политипов, но я не хотел неправильно переводить это в haskell. По сути, если одна переменная имеет тип *, а другая — *, это означает, что они могут быть любого типа, но они должны быть одного типа. Если у кого-то есть **, это означает, что он может, но не обязательно иметь тот же тип, что и *. Я думаю, что это соответствует a, b, c и т. Д. В использовании Haskell.
Моя работа до сих пор
Из определения длины вы можете видеть, что оно находит длину списка чего угодно, так что это дает
length :: [*] -> num.
Из определения я думаю, что swap принимает функцию и два параметра и производит функция с двумя переставленными параметрами, так что это дает
swap :: (* -> ** -> ***) -> ** -> [*] -> ***
foldr принимает бинарную функцию (, например, плюс )начальное значение и список, и сворачивает список справа налево, используя эту функцию.Это дает
foldr :: (* -> ** -> **) -> ** -> [*] -> **)
Я знаю, что в композиции функций это правая ассоциативность, поэтому, например, все справа от первой точки (. )должен создать список, потому что он будет передан в качестве аргумента первой папке.
Функция foldr выводит одно значение (результат свертки списка ), поэтому я знаю, что возвращаемый тип будет каким-то политипом, а не списком политипов.
Моя проблема
Я не знаю, что делать дальше. Я вижу, что swap должен принимать другой аргумент, значит ли это частичное применение, что все это является функцией? Я совсем запутался!