2017-02-19 117 views
-2

我修改了,我接下來要對Haskell和的一個問題測試的類型聲明:哈斯克爾 - 給功能

(B)給出類型聲明完成以下(可能不完全)功能定義:

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

請問有人能幫我回答這個問題嗎?如果你可以分析爲什麼答案是什麼,那麼將非常感激。

謝謝

+0

你有多遠?你卡在哪裏? – melpomene

回答

2

首先你要確定數據的「形狀」。你可以通過查找構造函數來完成。 這裏有(:),列表的構造函數和(,),元組的構造函數。 可以推斷該類型有形狀

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

然後你可以尋找更多的約束上ab。 由於x+1,你必須假設x是一個數字。 由於y+2.5,你必須假設y也是一個數字,但分數。

所以,

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

說實話數字類型在Haskell中最容易的事情。 您可以在ghci中使用:t來詢問表達式的類型。

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

順便說一句,如果您通過一個空列表unzOp會發生什麼?

或換句話說,unzOp是遞歸定義的,但基本情況是什麼?