-2
我修改了,我接下來要對Haskell和的一個問題測試的類型聲明:哈斯克爾 - 給功能
(B)給出類型聲明完成以下(可能不完全)功能定義:
ii。
unzOp ((x,y):zs) = ((x+1):(fst(unzOp zs)),(y+2.5):(snd(unzOp zs)))
請問有人能幫我回答這個問題嗎?如果你可以分析爲什麼答案是什麼,那麼將非常感激。
謝謝
我修改了,我接下來要對Haskell和的一個問題測試的類型聲明:哈斯克爾 - 給功能
(B)給出類型聲明完成以下(可能不完全)功能定義:
ii。
unzOp ((x,y):zs) = ((x+1):(fst(unzOp zs)),(y+2.5):(snd(unzOp zs)))
請問有人能幫我回答這個問題嗎?如果你可以分析爲什麼答案是什麼,那麼將非常感激。
謝謝
首先你要確定數據的「形狀」。你可以通過查找構造函數來完成。 這裏有(:)
,列表的構造函數和(,)
,元組的構造函數。 可以推斷該類型有形狀
unzOp :: [(a, b)] -> ([a], [b])
然後你可以尋找更多的約束上a
和b
。 由於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
是遞歸定義的,但基本情況是什麼?
你有多遠?你卡在哪裏? – melpomene