У меня есть этот код Javascript:
N1 = Math.floor(275 * month / 9)
N2 = Math.floor((month + 9) / 12)
N3 = (1 + Math.floor((year - 4 * Math.floor(year / 4) + 2) / 3))
N = N1 - (N2 * N3) + day - 30
return N
Я попытался передать это в Haskell. Вот так:
day_of_year year month day = n1 - (n2 * n3) + day - 30
where
n1 = floor(275 * fromIntegral month / 9)
n2 = floor( month + 9 / 12)
n3 = 1 + floor((year - 4 * floor(fromIntegral year / 4) + 2) / 3)
Это не работает:( Вот мои вопросы:
-
Почему тип
n1
написан какn1 :: (Integral b, RealFrac a) => a -> b
но не нравитсяn1 :: (RealFrac a, Integral b) => a -> b
То же самое сfloor :: (Integral b, RealFrac a) => a -> b
Ответ: заказ не имеет значения в левой части = >
ghci, как правило, попытается сохранить порядок так же, как и порядок в декларации
но иногда по умолчанию выполняется abc-упорядочение -
Правильно ли это утверждение:
n1
принимает целочисленное число и возвращает RealFrac.Ответ: Да. Если мы знаем, что упорядочение неважно с левой стороны = >
то мы также знаем, что (Интеграл b, RealFrac a) === (RealFrac a, Интеграл b)
что важны только типы a → b
или в этом случае Интеграл → RealFrac -
n3
имеют болезнь Мономорфизма. Как его можно вылечить?
Меня больше интересует большая картина, чем просто работа над этим. Я читал о моно... но я понятия не имею, куда положить:: в этом случае: (Ответ: Здесь нет мономорфизма. Посмотрите на FUZxxl ответ:)
-
Может
day_of_year
быть следующим:Integral -> Integral -> Integral -> Integral
?
Принимает 3 интеграла и возвращает интегральный результат.Ответ: Да, это возможно! Он также может быть :: Интеграл a = > a → a → a → a
:: Int → Int → Int → - > Int
:: (Интеграл a, Интеграл a2, Интеграл a1) = > a → a1 → a2 → a2 -
Я полагаю, что
day_of_year
может принимать только 3 Ints или 3 целых числа. Он не мог принять микс, как 2 Ints 1 integer. Правильно?FUZxxl: Нет, он может принимать разные типы аргументов! Посмотрите на продолжение 4!!!
-
Можно ли создать
day_of_year
, чтобы взять 3 Nums и вернуть Num?FUZxxl: Да, это так! Поместите aEnum в течение года, месяца и дня.