Константы в Haskell и сопоставление с образцом

Как можно определить макроконстанту в Haskell? В частности, я хотел бы, чтобы следующий фрагмент выполнялся без перекрытия второго шаблона.

someconstant :: Int
someconstant = 3

f :: Int -> IO ()
f someconstant = putStrLn "Arg is 3"
f _            = putStrLn "Arg is not 3"

person user19018    schedule 15.02.2016    source источник
comment
Уточните, что вы ищете не охрану f x | x==someconstant = putStrLn "is 3", а выкройку. (Верно?)   -  person chi    schedule 15.02.2016


Ответы (1)


Вы можете определить синоним шаблона:

{-# LANGUAGE PatternSynonyms #-}

pattern SomeConstant :: Int
pattern SomeConstant = 3

f :: Int -> IO ()
f SomeConstant = putStrLn "Arg is 3"
f _            = putStrLn "Arg is not 3"

Но также подумайте, не лучше ли сопоставлять пользовательский тип варианта вместо Int.

person leftaroundabout    schedule 15.02.2016