Указание правил по умолчанию на языке карри: почему и как? - PullRequest
0 голосов
/ 18 ноября 2018

В разделе 3.5.6 учебника Curry (pdf) рекомендуется использовать правила по умолчанию, чтобы "восстановить контроль после неудачного поиска". Следующий пример приведен. (Для ясности я добавил сигнатуру типа и каррировал ввод.)

lookup :: k -> [(k,v)] -> Maybe v
lookup key (_++[(key,value)]++_ ) = Just value
lookup’default _ _ = Nothing

Я не могу заставить это скомпилироваться, пока я не заменю на '. Как только я это сделаю, он ведет себя так:

test> test.lookup 1 [(2,3)]
*** No value found!

Вопрос 1. Для чего используется объявление по умолчанию?

Зачем вам нужно указывать, что конкретное предложение является предложением по умолчанию? Не будет ли это так или иначе достигнуто, когда другие потерпят неудачу?

Вопрос 2: Как это написано? Должно ли оно быть написано вообще?

Если вместо этого я опущу строку 'default:

lookup :: k -> [(k,v)] -> Maybe v
lookup key (_++[(key,value)]++_ ) = Just value
lookup _ _ = Nothing

ведет себя как задумано:

test> test.lookup 1 [(2,3)]
Nothing
test>

Изменился ли синтаксис 'default с момента написания учебника? Был ли он вообще удален?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Если вы удалите опцию «-F», препроцессор не будет вызван, что объясняет поведение.

Ошибка разрешения связана с тем, что не все возможные промежуточные представления программы Curry предварительно скомпилированыв пакете Ubuntu.К сожалению, «транслятору правил по умолчанию» CurryPP требуется одно из этих промежуточных представлений.

Пакет Ubuntu / Debian предназначен только для использования ядра Curry.Для расширений и более продвинутых инструментов я рекомендую установить PAKCS вручную, например, текущий выпуск из https://www.informatik.uni -kiel.de / ~ pakcs / download.html Если у вас уже есть Ubuntu, просто make должно быть достаточно.

0 голосов
/ 19 ноября 2018

Это код, который вы ищете. У вас отсутствовала директива препроцессора, разрешающая правила по умолчанию. И используя неправильный символ кавычки.

-- Use default rules
{-# OPTIONS_CYMAKE -F --pgmF=currypp --optF=defaultrules #-}

lookup :: k -> [(k,v)] -> Maybe v
lookup key (_++[(key,value)]++_ ) = Just value
lookup'default _ _ = Nothing

test_positive = lookup 2 [(2,3)] == Just 3
test_negative = lookup 1 [(2,3)] == Nothing

Правило по умолчанию служит различным целям. Восстановление контроля после неудачного поиска является особенно полезным, поскольку вы не можете проверить с равенством, является ли выражение ошибочным.

...