Почему я не могу сопоставить шаблон с соотношением в Haskell?

Я пытаюсь сопоставить шаблон с соотношением:

isValid :: Ratio Int -> Bool
isValid (num % den) = ...

Однако это дает:

Parse error in pattern: num % den

Интересно, что пакет Data.Ratio определяет функции numerator и denominator таким образом, но с оператором :%:

numerator   (x :% _)    =  x
denominator (_ :% y)    =  y

Однако у меня нет доступа к этому последнему оператору.

Может ли кто-нибудь объяснить, почему мое сопоставление с образцом не работает и как я могу это исправить?


person Ben    schedule 25.10.2015    source источник
comment
@Dair, это дает мне Not in scope: data constructor ‘:%’   -  person Ben    schedule 25.10.2015
comment
Как вы определили Ratio?   -  person Dair    schedule 25.10.2015
comment
@Dair Я использую пакет Data.Ratio: hackage. haskell.org/package/base-4.8.1.0/docs/Data-Ratio.html   -  person Ben    schedule 25.10.2015
comment
Не похоже, что это возможно. Вы можете определить шаблон просмотра   -  person luqui    schedule 25.10.2015
comment
@luqui Почему совпадение с образцом невозможно? Точно так же, как вы можете сопоставлять шаблон со списком (x:xs) с помощью оператора (:), должна быть возможность использовать (%) для соотношений, не так ли? И почему источник использует сопоставление с образцом, но я не могу получить доступ к этому оператору (:%).   -  person Ben    schedule 25.10.2015
comment
Вам нужно будет импортировать GHC.Real, чтобы получить доступ к конструктору :%. Data.Ratio просто не экспортирует :%. Вы не можете сопоставить шаблон с %, потому что это функция, а не конструктор.   -  person user2407038    schedule 25.10.2015
comment
Потому что модуль не предоставляет оператора своим пользователям. Вероятно, это связано с тем, что он имеет инварианты (например, a:%b должен иметь b/=0 и gcd a b = 1), поэтому было бы небезопасно позволять пользователям создавать произвольные значения. И Haskell не может предоставить оператор только для сопоставления с образцом, а не для построения (хотя для этого нет существенной причины, кроме усложнения механизма импорта).   -  person luqui    schedule 25.10.2015
comment
@user2407038 user2407038 Сработало, спасибо!   -  person Ben    schedule 25.10.2015
comment
@luqui Думаю, я понимаю, что ты имеешь в виду, это имеет смысл. Я думаю, что в этом случае я предпочитаю философию Python, мы все здесь взрослые, когда пользователь должен ответственно использовать, в данном случае оператор.   -  person Ben    schedule 25.10.2015
comment
Ха-ха. Да, культура Haskell стремится создавать очень безопасные библиотеки. Как человек, профессионально работающий с питоном, могу сказать, что всем нравится верить, что они единственные, кому разрешено не следовать правилам...   -  person luqui    schedule 25.10.2015
comment
@luqui Вместе с синонимами шаблонов это возможно (хотя вам придется дать ему другое имя, если вы хотите сделать это в том же модуле).   -  person Alexey Romanov    schedule 25.10.2015


Ответы (1)