Из раздела 3.13.3 учебника curry:
Операции, которые вычеты называются жесткими, тогда как операции, узкие, называются гибкими. Все определенные операции являются гибкими, тогда как большинство примитивных операций, таких как арифметические операции, являются жесткими, поскольку угадывание для них не является разумным вариантом. Например, прелюдия определяет операцию конкатенации списка следующим образом:
infixr 5 ++
...
(++) :: [a] -> [a] -> [a]
[] ++ ys = ys
(x:xs) ++ ys = x : xs ++ ys
Поскольку операция "++" является гибкой, мы можем использовать ее для поиска списка, удовлетворяющего определенному свойству:
Prelude> x ++ [3,4] =:= [1,2,3,4] where x free
Free variables in goal: x
Result: success
Bindings:
x=[1,2] ?
С другой стороны, предопределенные арифметические операции, такие как добавление "+", являются жесткими. Таким образом, вызовите "+" с логической переменной в качестве аргумента:
Prelude> x + 2 =:= 4 where x free
Free variables in goal: x
*** Goal suspended!
Карри, похоже, не защищает от записи целей, которые будут приостановлены. Какие системы типов могут заранее определить, будет ли цель приостановлена?