Довольно увлекательная 2013 вводного поста в Haskell основой KiCS2 реализации Curry Вольфганга Jeltsch, A Taste of Curry, дает следующее определение для inverse
комбинатора:Compact против полного/многословного определения обратного комбинатора/оператора в Карри
inverse :: (a -> b) -> (b -> a)
inverse f y | f x =:= y = x where x free
(Примечание: это делает такие вещи, как inverse (+1) 3 == 2
и inverse (*3) 12 == 4
и inverse htmlHodeToStr == parseHtmlNode
и бесконечности другой невероятно удивительным вещи, для прохожих, не знакомые с Карри)
Кроме, он также предлагает 2 альтернативных, но эквивалентные определения (недетерминистической) split :: [a] -> ([a], [a])
функции:
split :: [a] -> ([a],[a])
split list | front ++ rear =:= list = (front,rear)
и
split' :: [a] -> ([a],[a])
split' (xs ++ ys) = (xs,ys)
, а также некоторые другие довольно просветительские определения, которые, однако, выходят за рамки этой публикации.
Однако, мое мышление привело меня к попытке альтернативы, уплотненное определению inverse
в духе split
и split'
:
inverse' :: (a -> b) -> (b -> a)
inverse' f (f x) = x
это, с другой стороны, приводит к следующей ошибке:
Undefined data constructor `f'
Мой вопрос: почему Карри интерпретировать f
в потенциальный FUNC в качестве конструктора данных, но ++
в (также функциональном) шаблоне (xs ++ ys)
в качестве имени функции?
Другими словами, то xs
и ys
в split' (xs ++ ys) = (xs,ys)
, кажется, в точности аналогично x
в inverse' f (f x) = x
.
Или если аналогия с split'
не сразу очевидна, рассмотрите prefix (xs ++ _) = xs
или orig (1 + x) = x
и т. Д., Которые компилируются и выполняются просто отлично.
P.S. Я адаптировал имена и типы подписей чуть-чуть по сравнению с исходным сообщением, чтобы упростить этот вопрос.
А-ха, я вижу, как это имеет смысл сейчас, и даже ответ Бьорна этим утром уже был поучительным. В любом случае, я предполагаю, что значение способности «инвертировать f (f x) = x' не будет компенсировать недостатки? Или это просто не стоит дополнительных усилий, учитывая преимущества? Что-то в этом роде? –
Основная проблема заключается в том, чтобы обеспечить разумное значение такой конструкции. Потребовалось много времени, чтобы развить идею функциональных паттернов как декларативный эквивалент нестрогой унификации, и, таким образом, я предполагаю, что нетривиально разработать теорию для таких новых конструкций. Оперативно вы можете их представить, но найти описание описания может быть затруднительным. –
Под «описанием описания» вы подразумеваете что-то по строкам «спецификация» или даже «обозначение» или «денотативная семантика»? –