Хаскель "Источник сокращения" - PullRequest
4 голосов
/ 22 мая 2010

Я готовлюсь к предстоящему экзамену на Haskell и не понимаю ни одного из вопросов из предыдущей статьи. Google включается ничего полезного

fst(x, y) = x
square i = i * i

i) Источник уменьшают, используя ленивую оценку Haskells, выражение:

fst(square(3+4), square 8)

ii) Источник сокращают, используя строгую оценку, то же выражение

iii) Укажите одно преимущество ленивой оценки и одно преимущество строгой оценки

Чего я не понимаю, так это сокращение источника ?

Ответы [ 2 ]

9 голосов
/ 22 мая 2010

Сокращение - это термин из лямбда-исчисления, который включает в себя сохраняющее семантику преобразование, которое заменяет один термин эквивалентным термином.Для приведенных вами примеров наиболее важным видом сокращений являются

  • Замена имени его определением (пример замены на равно).
  • Бета-сокращениеприложения функции.

Бета-редукция является фундаментальным правилом в лямбда-исчислении, а в чистом ленивом языке, таком как Haskell, она всегда сохраняет семантику.Бета-правило гласит:

(\x. e) m

может быть заменено на e с m вместо x.(Подстановка должна избегать «захвата» бесплатных экземпляров x в m.)

Вполне возможно, что ваш инструктор хочет, чтобы вы комбинировали сокращения следующим образом:

  1. Найтиприложение функции, где применяемая функция является именем.
  2. Замените имя на его определение, которое будет лямбда-абстракцией.
  3. Бета-сокращение приложения.
  4. Сделайте все это за один шаг.

Обратите внимание, что у вас часто есть выбор о том, какое приложение сократить;Например, в названии, которое вы даете, есть два применения square и одно из fst, которые можно уменьшить таким образом.(Применение + также может быть уменьшено, но для сокращения с использованием констант требуются другие правила.)

Из вопросов, которые я вижу, ваш инструктор хочет, чтобы вы сокращали каждый член несколько раз, пока он не достигнет нормальной формы и что ваш инструктор хочет, чтобы вы продемонстрировали свое понимание различных стратегий сокращения. Слово «источник» в «сокращении источника» является излишним; сокращение означает манипулирование исходными терминами в некоторых языках.Я бы сформулировал вопросы следующим образом:

  • Используя стратегию сокращения, которая соответствует ленивой оценке Хаскелла, приведите следующее выражение к нормальной форме слабой головы.Покажите каждый шаг в последовательности сокращений.

  • Используя стратегию сокращения, которая соответствует оценке на строгом функциональном языке, уменьшите следующее выражение до нормальной формы головы.

Вероятно, я бы выбрал быть менее скромным и просто назвал бы стратегии сокращения: стратегию сокращения по требованию и стратегию сокращения по стоимости.

7 голосов
/ 22 мая 2010

Из структуры вопроса, это , вероятно, просто означает "оценить выражение вручную", например,

head (map primeTest (enumFromTo 1000 2000))

в ленивом (оценивать только тогда, когданеобходимо) оценка,

  head (map primeTest (enumFromTo 1000 2000))
= head (map primeTest (1000 : enumFromTo 1001 2000))
= head (primeTest 1000 : map primeTest (enumFromTo 1001 2000))
= primeTest 1000
= False

в строгой (оцените все сначала) оценка

  head (map primeTest (enumFromTo 1000 2000))
= head (map primeTest (1000 : enumFromTo 1001 2000))
= ...
= head (map primeTest [1000, 1001, ..., 2000])
= head (primeTest 1000 : map primeTest [1001, 1002, ..., 2000])
= head (False : map primeTest [1001, 1002, ..., 2000])
= ...
= head [False, False, ..., False]
= False

Единственное релевантное место, которое я смог найти, это http://www.cs.bham.ac.uk/internal/modules/2009/11582.html, где "уменьшение источника" являетсяуказан как «метод программирования».(О_О)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...