Может ли Haskell совпадать с S-Expression как Racket? - PullRequest
0 голосов
/ 06 июня 2011

Я только начал изучать Haskell три дня назад, стремясь найти переводчика для некоторой пользовательской семантики в Haskell.У меня есть реализация интерпретатора в Racket, совпадение match на S-Expression в Racket довольно удобно.Когда дело доходит до Хаскелла, я не совсем уверен, существует ли что-то подобное?или я должен написать некоторые типы данных и проанализировать S-выражения для определенных типов данных, а затем использовать какой-то механизм сопоставления в Haskell?

То, что я хочу сопоставить (в ракетке), например, если естьэто ввод (из файла или с подставки), например: (lambda (v1 v2) (+ v1 v2)), затем в Racket я могу написать шаблон: (lambda (,v ...) ,body).а потом делай, что хочу позже.В Хаскеле я могу сделать что-то подобное?

1 Ответ

1 голос
/ 06 июня 2011

Классический Haskell не обеспечивает обобщенного сопоставления с образцом.Он обеспечивает как стандартное сопоставление с образцом, так и охрану.Таким образом, вы можете писать такие вещи, как

foo :: [Int] -> ...
foo [1,2,3] = <some expression>
foo [1,2,x] = <some expression that can use x>
foo (x:xs) = <some expression where x is the first element, and xs is the rest>
foo (x:x':xs) = <some expression where x is the first element, x' the second, and xs is the rest>

bar :: (Int,String) -> ...
bar (1,"hello") =
bar (someInt,someString) =
bar (someInt,_) = 
bar _ = 

поочередно:

bar :: (Int, String) -> ...
bar x = case x of
         (1,"hello") -> ...
         _ -> ...

поочередно:

bar :: (Int, String) -> ...
bar (someInt,someString) 
         | someInt == 1 && someString == "hello" = ...
         | someInt == 2 && someString == "hello" = ...
         | otherwise = ...

GHC также предоставляет расширения для более удобной интеграции охранников и сопоставления с образцом.См. Разделы «Просмотр шаблонов» и «Стражи образцов»: http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html

...