Шаблон сопоставления простых типов
Я новичок, пытающийся научиться функциональному программированию.
Есть ли способ сопоставления с образцом различных стандартных (не определенных пользователем) типов?
Например, если аргумент функции является кортежем, добавьте их, если это просто 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).
Привет, Аннемари