2015-02-18 2 views
0

Как получить конструктор как функцию из аргумента (G) ADT в Haskell? Можно ли сделать что-то вроде этого?Как получить конструктор как функцию из аргумента (G) ADT в Haskell?

data Ex1 = C1 Int | C2 Int -- | ..... 
      | C3 

fun :: Ex1 -> Ex1 
fun C3 = C3 
fun (c i) = c $ i^2 

Это не подходит для меня.

fun (C1 i) = C1 $ i^2 
fun (C2 i) = C2 $ i^2 
+2

Почему соответствия на конструкторах "не подходит? –

+0

Потому что много конструкторов. Я не хочу дублировать большой код. По факту. данные AST = Imm Int | Arg Int | Добавить AST AST | Суб AST AST | Мул АСТ AST | Div AST AST ...... –

+0

Большие типы данных - это что-то вроде запаха кода. Возможно, стоит попытаться упростить дизайн вашего АСТ. –

ответ

6

Если вы нормально с изменением типа Ex1 затем:

{-# LANGUAGE DeriveFunctor #-} 

data Ex1 a = C1 a | C2 a 
      | C3 deriving (Show, Functor) 

fun :: Ex1 Int -> Ex1 Int 
fun y = fmap (\x -> x^2) y 

Demo в ghci:

λ> fun $ C1 3 
C1 9 
λ> fun $ C2 3 
C2 9 
λ> fun C3 
C3 
+0

Поблагодарите U. Но я слишком упрощенную реальную задачу. По факту. данные AST = Imm Int | Arg Int | Добавить AST AST | Sub AST AST | Mul AST AST | Div AST AST уменьшить :: (Int-> Int-> Int) -> AST -> AST уменьшить f (tab) = go ab где go (Imm a) (Imm b) = Imm $ fab go ab = tab –

+1

Это будет по-прежнему работать для вашего использования с 'data AST a = Imm a | Arg Int | Добавить (AST a) (AST a) | ... '. Тогда вам просто нужна дополнительная функция для 'Arg', предполагая, что' Imm' является конструктором значений в вашем языке выражения и что 'Arg' - это что-то еще. «Arg a» также может работать, в зависимости от того, что представляют собой конструкторы. –

 Смежные вопросы

  • Нет связанных вопросов^_^