2015-12-09 2 views
-4

мы начали с алгебраических типов данных. В качестве примера у нас есть:данные типа алгебраических данных Nat = Zero | S Nat

add :: Nat -> Nat -> Nat 
add a Zero = a 
add a (S b) = add (S a) b 

add' :: Nat -> Nat -> Nat 
add' a Zero = a 
add' a (S b) = S (add' a b) 

Что это означает? хорошо, добавьте Zero = a, я думаю, это ясно. Но добавить (S b) = добавить (S a) b? и добавить' ?

большое спасибо;)

+0

Вы экспериментировали с ними в 'ghci'? – dfeuer

+2

Это две различные реализации добавления, поэтому два разных имени ('add',' add''). Значение 'add a (S b) = add (S a) b' является своего рода« если второй аргумент отличен от нуля, увеличивайте первый аргумент и уменьшайте второй аргумент ». –

+2

Возможно, это поможет, если вы прочитаете 'S' как' 1 + ', так что' S b' '1 + b'. Тогда 'add a (1 + b) = add (1 + a) b' выглядит вполне читаемым для меня, а также' add 'a (1 + b) = 1+ (add' a b) '. –

ответ

3

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

Первое: Добавление 3 и 2 равна добавления 4 и 1, равна добавление 5 и 0, где мы знаем ответ 5.

Второе: Добавление 3 и 2 является нахождение следующего числа после добавления 3 и 1, что является следующим следующим числом после добавления 3 и 0. Итак, ответ подсчитывается дважды на 3.