Я использую библиотеку диаграмм решений в программе Haskell. Для этого я хочу объявить 2 разных (новых) типа, которые отслеживают, с какой диаграммой решений я имею дело. Библиотека, которую я использую, — это cudd, а базовым типом диаграммы решений является DdNode, но мой вопрос связан только с haskell.
newtype Bdd = ToBdd Cudd.Cudd.DdNode
newtype Zdd = ToZdd Cudd.Cudd.DdNode
Обычно я хочу различать их при вызове функций, но теперь я хочу использовать функцию, которая не должна различать два типа. Я в основном пытался решить это тремя разными способами:
data Dd = ToBdd Bdd | ToZdd Zdd
printDdInfo :: Dd -> IO()
printDdInfo (ToZdd dd) = do
putStrLn "Hello, zdd!"
Cudd.Cudd.cuddPrintDdInfo manager dd
printDdInfo (ToBdd dd) = do
putStrLn "Hello, bdd!"
Cudd.Cudd.cuddPrintDdInfo manager dd
printDdInfo :: Either Bdd Zdd -> IO()
printDdInfo (ToZdd dd) = do
putStrLn "Hello, zdd!"
Cudd.Cudd.cuddPrintDdInfo manager dd
printDdInfo (ToBdd dd) = do
putStrLn "Hello, bdd!"
Cudd.Cudd.cuddPrintDdInfo manager dd
printDdInfo :: Either Bdd Zdd -> IO()
printDdInfo dd = case dd of
Zdd dd -> do
putStrLn "Hello, bdd!"
Cudd.Cudd.cuddPrintDdInfo manager dd
Bdd dd -> do
putStrLn "Hello, bdd!"
Cudd.Cudd.cuddPrintDdInfo manager dd
Все эти методы не помогли. Каков самый элегантный способ написания этого кода? Спасибо за внимание.
Cudd.Cudd.cuddPrintDdInfo
? Требуется лиCudd.Cudd.DdNode
? - person Aplet123   schedule 15.07.2020DdNode
напрямую, а не пытаться сделать это с помощью магии типов. Если это слишком грязно, я думаю, что @DanielWagner заниженное предложение а> вполне неплохо.printDdInfo :: (HasNode a) => a -> IO ()
- person luqui   schedule 17.07.2020