Краткое описание: Это экзамен на экзамене с экзамена Миранда, но синтаксис очень похож на Haskell.Haskell/Miranda: Найдите тип функции
Вопрос: Каков тип следующего выражения и что он делает? (Определения длины функций и свопа приведены ниже).
(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 usuage.
Мой работает до сих пор
Из определения длины вы можете видеть, что он находит длину списка ничего так что это дает
length :: [*] -> num.
Из определения Я думаю, что обмен происходит в функцию и два параметра и выдает функцию с двумя измененными параметрами, поэтому это дает
swap :: (* -> ** -> ***) -> ** -> [*] -> ***
foldr принимает двоичную функцию (например, плюс) начальное значение и список и сбрасывает список справа налево, используя эту функцию. Это дает
foldr :: (* -> ** -> **) -> ** -> [*] -> **)
Я знаю, что в функции композиции это правильно ассоциативный так, например, все, справа от первой точки (.) Должен составить список, так как он будет передан в качестве аргумента в первой foldr.
Функция foldr выводит одно значение (результат свертывания списка), поэтому я знаю, что тип возвращаемого значения будет своего рода полититом, а не политическим типом.
Моя проблема
Я не уверен, куда идти здесь на самом деле. Я вижу, что обмен должен принять другой аргумент, так же как это частичное приложение подразумевает, что все это функция? Я совсем смущен!
Просто установите [Haskell Platform] (http://hackage.haskell.org/platform/) и использовать GHCi, чтобы проверить его, в чем проблема? 'Prelude> let swap = flip'' Prelude>: t (foldr (+) 0). (foldr ((:). length. (swap (:) [])) []) ' ' (foldr (+) 0). (foldr ((:). length. (swap (:) [])) []) :: [a] -> Int'. – leftaroundabout
спасибо за ответ, но я надеялся получить некоторую помощь и понять, как туда попасть! Хотя знание ответа, безусловно, поможет мне попытаться выяснить маршрут там, так что спасибо снова – user1058210
Ну, вы можете протестировать любое подвыражение полного в GHCi, что должно очень хорошо дать вам понять, как туда добраться. – leftaroundabout