Задать вопрос
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
не вышло
  • Вопрос задан
  • 402 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 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 этого ещё не умеет. Возможно, в будущем такая фишка будет добавлена как одно из многочисленных расширений языка.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы