DennisKingsman
@DennisKingsman
Студент

Сопоставление с образцом( Haskell )?

есть функция
substitute :: Char -> Char -> String -> String
substitute x y [] = []
substitute x y (h:hs) = if h == x than y : substitute x y hs
else h : substitute x y hs
которая заменяет в строке какие то буквы x на буквы y , пытался переделать это под сопоставление с образцом так что , если допустим голова списка совпадает с буквой x то он бы менял , иначе шел бы дальше
substitute :: Char -> Char -> String -> String
substitute x y [] = []
substitute x y (x:hs) = y : substitute x y hs
else _ : substitute x y hs
не вышло
  • Вопрос задан
  • 270 просмотров
Решения вопроса 1
youngmysteriouslight
@youngmysteriouslight
ТК, ТТ, JS, FP, WM
В Haskell в отличие от, например, Wolfram Mathematica в перечне образцов в рамках одного случая каждая переменная может быть использована только единожды.
На самом деле образцы являются краткой формой записи системы проекций для произведений-типов и разбора случаев для сумм-типов.
Например,
substitute x y [] = ...
substitute x y (h:hs) = ...
является краткой формой записи (кстати, "упрощенный" Хаскель, к которому ghc приводит код перед компиляцией, как раз такое представление использует)
substitute x y z = case z of
  [] -> ...
  (h:hs) -> ...
или, если гиперболизировать,
substitute x y z = if null z then ... else let h = head z; hs = tail z in ...

Основная мысль: все переменные в образцах принципиально обязаны быть разными в общем случае.
Например, как быть с func x x = ..., когда x :: a -> b?
Исключение есть всего одно: когда тип обеих переменных имплементирует Eq. Но современный Haskell этого ещё не умеет. Возможно, в будущем такая фишка будет добавлена как одно из многочисленных расширений языка.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
26 окт. 2020, в 13:50
5000 руб./за проект
26 окт. 2020, в 13:47
2000 руб./за проект
26 окт. 2020, в 13:38
1500 руб./за проект