我想創建一個元組,裏面有一個箭頭和一個描述箭頭的字符串。哈斯克爾箭頭裏面的箭頭
funTimes10 = (*10)
describe10 = "times 10"
tuple10 :: (Num b) => ((b -> b), String)
tuple10 = (,) funTimes10 describe10
我可以fst
訪問功能,並與snd
我得到的功能的描述字符串:如果我和功能(而不是箭頭),以下的作品像預期的這樣做。
但是,如果我在下面的交換功能有一個箭頭,如:
aTuple10 :: (Arrow a, Num b) => (a b b, String)
aTuple10 = (,) (arr funTimes10) describe10
fst
仍然有效,並返回我的箭,但- 我沒有得到任何描述字符串
snd
。
我只得到了此錯誤消息:
Ambiguous type variable `a0' in the constraint:
(Arrow a0) arising from a use of `aTuple10'
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `snd', namely `aTuple10'
In the expression: (snd aTuple10)
In an equation for `it': it = (snd aTuple10)
爲什麼我得到這個錯誤,而我應該怎麼做,才能避免呢?
就是這樣;)thx – frosch03 2012-02-27 14:07:02
有多刺激。人們會期望類型系統能夠得出結論:'snd aTuple10'的類型是'String';這可以被視爲實施中的錯誤嗎?當然,Haskell 2010沒有指定這樣的行爲。有人可能會爭辯說,如果實現不知道第一個東西是什麼類型的,它不會知道第二個東西在內存中的什麼位置,但是因爲我們在這裏處理盒裝元組,所以應該總是有兩個指針,因此無論第一個元素的類型如何,第二個元素都可以輕鬆定位。 – 2012-02-27 21:41:57
像'class Boolish a where toBool :: a - > Bool; foo :: Boolish a =>(a,b) - > b; foo(a,b)=如果toBool a然後b else undefined'是可以想象的,所以函數的結果可以依賴於一個模棱兩可的參數。在這種情況下,'snd'的特殊外殼會很奇怪。 – dflemstr 2012-02-27 21:54:59