2015-10-25 2 views
0

Я хотел бы определить функцию, которая работает с выражением определенного типа, но имеет доступ к ее внутренней структуре, если она есть. Так, например, е в дальнейшем:Соответствие шаблону Haskell внутри круглых скобок

g :: a -> a -> a 
g x y = y 

f :: a -> a 
f x'@(g x y) = x' 
f _ = 1 

(г х у) имеет тип а, так что е должны быть в состоянии принять его в качестве аргумента, но определение F выше, не может быть проанализирован с помощью Haskell. Я хотел бы определить что-то вроде f, чтобы воспользоваться оценкой по имени. Есть ли способ сделать это в Haskell?

+0

Вы просто не можете этого сделать, потому что система типа не допускает этого. Но не заботьтесь! Haskell ленив и не будет оценивать аргумент, если он явно не нужен, поэтому его по-разному «по имени» по умолчанию. – Mephy

+2

'g' не является конструктором, поэтому вы не можете сопоставить его. Что вы на самом деле пытаетесь сделать? –

ответ

0

Во-первых, соответствие шаблонов допускается только для шаблонов, то есть выражений, построенных из приложения, конструкторов и переменных (используется не чаще одного раза).

Во-вторых, даже если бы он был продлен, ваш пример является проблематичным, поскольку ваш g не инъективны:

case g x y of g a b -> a 

должны быть равны, так как g x y = y

case y of g a b -> a 

но a может быть что угодно ,

Если вместо этого случается, что g определяется выражением, которое может быть образцом, то GHC может разрешить использовать его в качестве шаблона, если вы попросите его через расширение GHC PatternSynonyms.

pattern G a b = ("hello", b, a) 

foo = case someTriple of 
     G a b  -> use a b 
     (s, x, y) -> ... 

bar = G 4 5  -- we can also use G as a function