Можно ли в нем сделать полиморфизм по четности числа? Т.е. у нас будет два числовых типа Even (нечетные) и Odd (четные), и для каждого можно определить свою функцию.
[code] *Oddev> show 4 Even: 4 *Oddev> show 7 Odd: 7 [/code]
Вот такое можно сделать с помощью типов, а не прямой проверки на четность, нечетность? Насколько я понимаю - нет, ведь тогда нужна будет проверка во время исполнения, а язык у нас статический.
*Oddev> show (fromInt 4)
"Even: 4"
*Oddev> show (fromInt 7)
"Odd: 7"
проверка во время исполнения
в чём разница между «прямой проверкой на чётность» и «проверкой во время исполнения»? не проблема делать как-то вот так, например:
*Oddev> (Even 2)
Even: 4
*Oddev> (Odd 3)
Odd: 7
всё, никаких проверок - но конструктор типа надо указать. можно написать TH-генератор, который будет делать это сам во время компиляции. тебя это интересовало?
в чём разница между «прямой проверкой на чётность» и «проверкой во время исполнения»? не проблема делать как-то вот так, например:
*Oddev> (Even 2)
Even: 4
*Oddev> (Odd 3)
Odd: 7
всё, никаких проверок - но конструктор типа надо указать. можно написать TH-генератор, который будет делать это сам во время компиляции. тебя это интересовало?
Если есть f :: Int -> Int можно ли сделать такой тип Even и переопределить ее как f (Even a) -> Int, не указывая напрямую конструктор типа при вызове? f 3 вызовет одну функцию, а f 2 - другую?
Если есть f :: Int -> Int можно ли сделать такой тип Even и переопределить ее как f (Even a) -> Int, не указывая напрямую конструктор типа при вызове? f 3 вызовет одну функцию, а f 2 - другую?
ээ.... ну если я правильно понял, то:
class Fable a where
f :: a -> Int
instance Fable Int where
f x = -- код для Int
instance Fable Even where
f x = -- код для Even
Ну деление вот писать не надо, но было бы неплохо сделать abs, signum, negate, s/Int/Integer/g, а потом instance Num MNum :) Заглядывая поглубже, получаем весьма правильный гуд:
data PNum = Odd PNum | Even PNum | Zero
data Sign = Plus | Minus
data MNum = MNum Sign PNum
Видимо, этого автор и желал. Весьма интересная фигня получается, btw.
>Если есть f :: Int -> Int можно ли сделать такой тип Even и переопределить ее как f (Even a) -> Int, не указывая напрямую конструктор типа при вызове? f 3 вызовет одну функцию, а f 2 - другую?