Шаблон сопоставления простых типов

Я новичок, пытающийся научиться функциональному программированию.

Есть ли способ сопоставления с образцом различных стандартных (не определенных пользователем) типов?

Например, если аргумент функции является кортежем, добавьте их, если это просто int, используйте int:

form (x, y) = x + y
form any_num = any_num

Это, очевидно, не сработает, потому что программа думает, что any_num - это просто любой кортеж и поэтому недоступен.

3 ответа

Решение

Я думаю, вы можете сделать следующее;

form :: Either (Int,Int) Int -> Int

form (Left (n,m)) = n + m
form (Right n)    = n

>> form (Left (2,3))
>> 5
>> form (Right 7)
>> 7 

Вы можете сделать это с помощью класса типов. Мы можем определить класс Formable типы, которые имеют form функция:

class Formable a where
    form :: a -> Int

Для целых, просто используйте int

instance Formable Int where
    form x = x

Если аргумент является кортежем, добавьте его аргументы вместе. Я собираюсь сделать еще один шаг, и вместо того, чтобы работать только над кортежами (Int, Int) его формируемый экземпляр будет работать на любом кортеже (a, b) до тех пор, пока оба a а также b являются Formable

instance (Formable a, Formable b) => Formable (a, b) where
    form (a, b) = form a + form b

Мы можем написать Formable экземпляры для других типов в том же духе. Как суммирование элементов списка

instance (Formable a) => Formable [a] where
    form = sum . map form

или альтернативы суммы

instance (Formable a, Formable b) => Formable (Either a b) where
    form (Left a) = form a
    form (Right b) = form b

или даже Maybe, если мы знаем, что делать с Nothing

instance (Formable a) => Formable (Maybe a) where
    form Nothing = 0
    form (Just a) = form a

В Миранде функция должна быть заданного типа. Например:

Ваша первая строка: form (x, y) = x + y имеет type:form :: (num,num) -> num

Есть два решения: Первое: использовать абстрактный тип с альтернативными случаями. Второе: использовать динамический язык FP (мне нравится Erlang).

Привет, Аннемари

Другие вопросы по тегам