2017-02-19 27 views
-2

я пересмотрев для теста, который я наступающий на Haskell и один из вопросов:Haskell - Дайте объявление типа функции

(б) Дать объявление типа выполнить следующие действия (возможно, неполный) определения функций:

ii. unzOp ((x,y):zs) = ((x+1):(fst(unzOp zs)),(y+2.5):(snd(unzOp zs)))

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

Спасибо

+0

Как далеко вы дошли? Где вы застряли? – melpomene

ответ

2

Сначала вы должны определить «форму» данных. Вы можете сделать это, ища конструкторы. Здесь вы найдете (:), конструктор для списка и (,), конструктор для кортежа. можно сделать вывод, что тип имеет форму

unzOp :: [(a, b)] -> ([a], [b]) 

Тогда вы можете искать более ограничения на a и b. Из-за x+1, вы должны принять x - это номер. Из-за y+2.5, вы должны принять y также номер, но дробный.

Так,

unzOp :: (Num a, Fractional b) => [(a, b)] -> ([a], [b]) 

Если честно числовые типы не самая легкая вещь в Haskell. Вы можете задать тип выражения, используя :t в ghci.

:t (\x -> x + 1) 
(\x -> x + 1) :: Num a => a -> a 

Кстати, что происходит, если вы передаете пустой список в unzOp?

Илиными словами, unzOp определен рекурсивно, но что такое базовый регистр?