Haskell / Miranda :Найдите тип функции

Кратко:Это вопрос из прошлого экзамена 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 должен принимать другой аргумент, значит ли это частичное применение, что все это является функцией? Я совсем запутался!

7
задан Will Ness 13 September 2016 в 16:13
поделиться