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
не вышло
  • Вопрос задан
  • 104 просмотра
Решения вопроса 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 этого ещё не умеет. Возможно, в будущем такая фишка будет добавлена как одно из многочисленных расширений языка.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Sirikid
Можно ещё что-то такое сочинить:
substitute _ _ "" = ""
substitute p s (c:cs) = go (p == c) : substitute p s cs where
  go False = c
  go True = s

Или использовать Data.Bool.bool.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
KUPIBILET.RU Санкт-Петербург
До 120 000 руб.
Рексофт Санкт-Петербург
от 200 000 руб.
ООО "Профит-Лига" Ростов-на-Дону
от 80 000 руб.
22 авг. 2018, в 08:57
113 руб./за 1000 зн.
22 авг. 2018, в 08:50
10000 руб./за проект
22 авг. 2018, в 06:57
150 руб./в час