typedef typename Tail::inUnion dummy;
Однако я не уверен, что реализация inUnion верна. Если я правильно понимаю, этот класс не должен быть создан, поэтому вкладка «fail» никогда не будет автоматически терпеть неудачу. Возможно, было бы лучше указать, находится ли тип в объединении или нет с простым булевым значением.
template
struct Contains; template struct Contains > { enum { result = Contains ::result }; }; template struct Contains > { enum { result = true }; }; template struct Contains { enum { result = false }; }; PS: Посмотрите на Boost :: Variant
PS2: посмотрите на typelists , особенно в книге Андрея Александреску: Modern C ++ Design
возврат является (перегруженной) функцией, и он не ожидает, что ее первым аргументом будет ключевое слово. Можно или заключить в скобки:
module Main where
import System(getArgs)
main = do
putStrLn "This is a test"
s <- foo
putStrLn s
foo = do
args <- getArgs
return (case args of
[] -> "No Args"
[s]-> "Some Args")
или использование удобный оператор приложения ($):
foo = do
args <- getArgs
return $ case args of
[] -> "No Args"
[s]-> "Some Args"
Stylewise, я выломал бы его в другую функцию:
foo = do
args <- getArgs
return (has_args args)
has_args [] = "No Args"
has_args _ = "Some Args"
, но все еще необходимо заключить в скобки или использовать ($), потому что возврат берет один аргумент, и функциональное приложение является наивысшим приоритетом.
Эквивалентно:
foo = do
args <- getArgs
case args of
[] -> return "No Args"
[s]-> return "Some Args"
Вероятно, предпочтительнее делать то, что предлагает wnoise, но это может помочь кому-то понять немного лучше.