TL; DR:什麼會導致GHCi中的類型不匹配錯誤純粹是由於函數組合?這是奇怪地看到GHCI評估以下代碼:Haskell:函數組合導致類型不匹配錯誤
foldl (a . b . c) crackle pop <- GHCi evaluates this`
......之後我們試圖評估以下只給一個錯誤:
let snap = a . b . c <- GHCi evaluates this
foldl snap crackle pop <- GHCi reports an error (!)
較長的版本:
我對我在GHCi觀察到的東西感到困惑,並希望有人能解釋它(描述如下圖所示):
做什麼我們上面看到?:
首先,我們有一個變量
b
這勢必以下列表:[(2,["Dipak"]), (2,["Andrew"]),(2,["Keone"])]
。b
是[(Int,[String])]
的類型。 (請參閱第一ghci>
提示和在屏幕截圖所得到的輸出的上方。)然後我們在
b
執行倍,將其轉化爲以下類型:Map (Integer, [String])
。我們通過使用基於insertWith (++)
的摺疊功能來實現這種功能,該功能是起始累加器,即empty
映射。的功能如下(同下文中上面的屏幕截圖的第二ghci>
提示(參見第二ghci>
提示上文)foldl' (flip $ uncurry (Map.insertWith (++))) (Map.fromList []) b
好的,涼爽;到目前爲止,那麼好
由於上面的
foldl'
函數是滿口的,我決定組成一個摺疊函數(名字爲foldingFunc
),它等於flip $ uncurry (Map.insertWith (++))
,這只是上面表達式中的第一個參數foldl'
(見let
表達式在第三個。提示以上)這是我感到困惑:作爲常規檢查,我執行相同的
foldl'
如上,除了與foldingFunc
(代替flip $ uncurry (Map.insertWith (++))
),它應該簡單地是一個外觀上的改變...現在GHCi報告類型不匹配錯誤(詳情如上)。
有人能幫我理解爲什麼在這種情況下,函數組合導致錯誤(由於類型改變)?我應該做什麼不同?
你打開了「MonomorphismRestriction」嗎? 「b」和「foldingFunc」的類型是什麼? (用ghci中的':t'檢查類型。) – Rufflewind 2014-11-06 05:09:05
賓果遊戲,剛剛關閉它,現在它正常工作。非常感謝。如果你複製粘貼你的評論到一個答案,我會(愉快地!)接受 – iceman 2014-11-06 05:22:33
yatima2975擊敗了我。 :) – Rufflewind 2014-11-06 05:53:27