Как Haskell оценивает эту подпись? - PullRequest
0 голосов
/ 22 ноября 2018

ggt_euklid :: Nat1 -> (Nat1 -> Nat1)

Я пытаюсь узнать частичное применение, я знаю, что в этом случае, если бы скобки были опущены, я бы получил тот же результат, но я не знаю, как эта подписьнужно оценить.

Насколько я понял, круглые скобки означают, что это функция?Не означает ли это, что ggt_euklid принимает значение Nat1 и возвращает функцию?

Ниже приведена полная функция:

ggt_euklid x y
| x == y = x
|x>y =ggt_euklid(x-y) y 
|x<y =ggt_euklid x (y-x)

Ответы [ 2 ]

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

Если бы не означало бы, что ggt_euklid принимает значение Nat1 и возвращает функцию?

Нет , это по-прежнему означает, что ggt_euklid принимает один аргумент типа Nat1 и возвращает функцию типа Nat1->Nat1, хотя скобки не учитываются .

Стрелка -> всегда имеет правоассоциативность(когда нет скобок), то есть:

Nat1 -> Nat1 -> Nat1 

эквивалентно

Nat1 -> (Nat1 -> Nat1)

, что соответствует приложению функции, всегда будет левой ассоциативностью.(без скобок), например:

ggt_euklid 1 2

эквивалентно

(ggt_euklid 1) 2

Здесь

(ggt_euklid 1) ~ Nat1 -> Nat1

и

(ggt_euklid 1) 2 ~ Nat1

Такнезависимо от того, применяются ли один или два аргумента к ggt_euklid, он всегда сначала возвращает функцию типа Nat1 -> Nat1; если указан второй аргумент, он применяет второй аргумент к возвращаемой функции.

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

Вы правильно поняли сигнатуру типа: она принимает один аргумент и возвращает функцию.Вот как работают функции с несколькими аргументами в Haskell: через каррирование.Вы можете увидеть это в действии, попробовав эту эквивалентную реализацию:

ggt_euklid :: Nat1 -> (Nat1 -> Nat1)
ggt_euklid x = \y -> result
  where result | x == y = x
               | x > y = ggt_euklid (x-y) y 
               | x < y = ggt_euklid x (y-x)

Здесь я ввел эту довольно бессмысленную переменную result, чтобы использовать ее для защиты шаблонов, но идея та же.

...