2016-01-10 3 views
0

Я пытаюсь создать функцию в Haskell, которая примет неотрицательное значение, соответствующее минутам, и вернет его в формате (дни, часы, минуты), например. 4000 минут даст (2, 18, 39).Ошибка в коде Haskell, содержащем кортежи

Мой код продолжает возвращать ошибку «file:.\prac0.hs:27 - Syntax error in input (unexpected `|')» при нагрузке.

Вот мой код:

dayshoursmins :: Int->(Int,Int,Int) 
dayshoursmins n = (x,y,z) 
    | n==0 = 0 
    | n`div`1440 =>1 = x && dayshoursmins(n`mod`1440) 
    | n`div`60 < 24 = y && dayshoursmins(n`mod`60) 
    | n < 60 = z 
+0

Любой случай, когда вы случайно смешаете вкладки с пробелами? –

+0

@JanDvorak: это не имеет ничего общего с вкладками/пробелами: обратите внимание на то, что труба помещается после '=' ... –

+0

О, хорошо ... Время закрываться как овальный шрифт, затем –

ответ

3

Труба (|) используется в качестве охранника, что вам нужно, это положение where я думаю:

dayshoursmins :: Int->(Int,Int,Int) 
dayshoursmins n = (d,h,m) 
    where d = div n 1440 
      dm = mod n 1440 
      h = div dm 60 
      m = mod dm 60 

Запуск этого с ghci дает:

*Main> dayshoursmins 2016 
(1,9,36) 

Я действительно не понимаю ваш код: он, кажется, смешивает всевозможные понятия. После того, как оператор =, вы не можете поставить охранников.

+1

Конструкции, введенные '|' просто называются «охранниками». [Шаблоны защиты] (https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/syntax-extns.html#pattern -guards) - это более совершенная форма охранников, которую GHC реализует как расширение , – chi

+0

@chi: справедливая точка. Обновлено. Большое спасибо. –

+0

А, спасибо. Могу ли я спросить, почему «дм»? В объявлении теперь отображается новое сообщение об ошибке: Ошибка типа в приложении *** Выражение: dm mod 60 *** Срок: dm *** Тип: Int *** Не соответствует: a -> b -> c – naturesenshi

Смежные вопросы