Почему я не могу сопоставить образец с соотношением в Haskell?
Я пытаюсь сопоставить образец с соотношением:
isValid :: Ratio Int -> Bool
isValid (num % den) = ...
Тем не менее, это дает:
Parse error in pattern: num % den
Интересно, что Data.Ratio
Пакет определяет numerator
а также denominator
таким образом, но с :%
оператор:
numerator (x :% _) = x
denominator (_ :% y) = y
Однако у меня нет доступа к этому последнему оператору.
Кто-нибудь может объяснить, почему мой шаблон не работает и как я могу это исправить?
1 ответ
Решение
Хотя в этом случае вы можете просто импортировать оператор из GHC.Ratio
, есть общее решение, начиная с GHC 7.8: шаблонные синонимы.
pattern num :% denom <- ((\x -> (numerator x, denominator x)) -> (num, denom))