Chcę utworzyć skrzynię zawierającą strzałkę i ciąg znaków opisujący strzałkę. Jeśli mogę to zrobić z funkcji (zamiast strzałek), następujące prace jak spodziewanych:Haskell Strzały wewnątrz krotek
funTimes10 = (*10)
describe10 = "times 10"
tuple10 :: (Num b) => ((b -> b), String)
tuple10 = (,) funTimes10 describe10
mogę uzyskać dostęp do funkcji z fst
iz snd
otrzymuję ciąg opis funkcji.
Jednakże, jeśli mogę wymienić funkcję ze strzałką, jak w poniższym przykładzie:
aTuple10 :: (Arrow a, Num b) => (a b b, String)
aTuple10 = (,) (arr funTimes10) describe10
fst
nadal działa i zwraca moją strzałkę, ale- ja nie dostać dowolny ciąg opis ze
snd
.
Mam tylko tego błędu wiadomość:
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)
Dlaczego mam ten błąd, i co należy zrobić, aby tego uniknąć? wygląd
to dokładnie to;) thx – frosch03
Jak irytujące. Można by się spodziewać, że system typów będzie w stanie wywnioskować, że 'snd aTuple10' ma typ' String'; czy można to uznać za błąd w implementacji? Z pewnością Haskell 2010 nie określa takiego zachowania. Można by argumentować, że jeśli implementacja nie wie, jaki typ ma pierwsza rzecz, nie będzie wiedzieć, gdzie w pamięci jest druga rzecz, ale skoro mamy tutaj do czynienia z pudełkowymi krotkami, zawsze powinny być dwa wskaźniki, a zatem drugi element można łatwo zlokalizować niezależnie od typu pierwszego. –
Funkcja taka jak "klasa Boolish a gdzie toBool :: a -> Bool; foo :: Boolish a => (a, b) -> b; foo (a, b) = jeśli doBool a następnie b else undefined' jest możliwe, więc wynik funkcji może zależeć od niejednoznacznego parametru. Specjalna obudowa 'snd' byłaby dziwna w tej sytuacji. – dflemstr