Исследование внутренностей функций в Haskell

UPDATE IP_ADMISSION_REQUEST ip1
SET IP1.WRIST_BAND_PRINT_STATUS=0
WHERE IP1.IP_ADM_REQ_ID        =
  (SELECT IP.IP_ADM_REQ_ID
  FROM IP_ADMISSION_REQUEST ip
  INNER JOIN VISIT v
  ON ip.ip_visit_id=v.visit_id
  AND v.pat_id     =3702
  ); `enter code here`
7
задан Sergey Mikhanov 14 February 2009 в 08:19
поделиться

3 ответа

Ваши примеры Схемы на самом деле не исследуют функции Схемы. Я недавно сделал некоторое символьное дифференцирование в Haskell по значениям следующего типа:

data Exp a = Lit a
           | Exp a :*: Exp a
           | Exp a :+: Exp a
           | Var String
  deriving Eq

Вместо того, чтобы отличить использование atom? или eq? Вы используете case (или другое сопоставление с образцом) и ==.

4
ответ дан 6 December 2019 в 23:13
поделиться

Во-первых, хотя SICP является большим, я рекомендовал бы против него для изучения Haskell. (#), Часть трудности в этом вопросе происходит от этого.

В Lisp/схеме, о 'функции' думают части кода, и исследование функции просто означает исследовать свой код. В Haskell, 'функция' средства что-то ближе к его математическому определению, как карта от набора к набору B. Так, например, имеет смысл, в контексте Lisp, сравнивать две функции: просто сравните их код. (Но (x+y)^2 и x^2+2*x*y+y^2 различные функции?) В Haskell, это зависит от того, существует ли там конструктивная процедура определения равенства для класса функций, которые Вы рассматриваете.

Точно так же как в Вашем вопросе, в Lisp/схеме, Вы записали бы "получить" функцию, которая дифференцируется правильно, когда данный выражения, и просто ошибки или возвращают мусор на произвольных исходных данных. Под системой типов Haskell это (AFAIK) невозможный сделать, because—, если Вы думаете о it— нет такой вещи как дифференциация произвольного входа: можно только дифференцировать Выражение (или возможно более общий класс, но все еще все). Таким образом, как в ответе Norman Ramsey, Вы сначала определяете тип "Выражения" (или введите класс), который очень прост сделать и затем записать функцию

derive :: Expression -> Expression

, который демонтирует Expression использование конструкций сопоставления с образцом (или что-то еще в зависимости от того, как Expression с были созданы).

<час>

(#): причина состоит в том, что SICP имеет совершенно другую философию, которая включает использование невведенного языка программирования и воодушевляющий отсутствие различия между кодом и данными. В то время как существует некоторая заслуга к "code=data" аргументу (например, то, что на архитектуре фон Неймана мы используем, "все - 0s и 1 с так или иначе"), это - не обязательно хороший способ рассуждать об или смоделировать проблемы. (См. Philip Wadler , Почему Вычисление Лучше, чем Интригование для больше на этом.), Если Вы хотите прочитать книгу Haskell с функциональным ароматом вместо Реальный мир один, возможно, Simon Thompson Haskell: Ремесло Функционального программирования или Richard Bird Введение в Функциональное программирование с помощью Haskell является лучшим выбором.

6
ответ дан 6 December 2019 в 23:13
поделиться

Я не думаю, что можно сделать это. Lisp гомографический , Haskell не.

Однако дальнейший поиск с помощью Google поднялся Liskell, который является интересным гибридом.

1
ответ дан 6 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: