Tôi muốn vẽ một bộ túp, giữ một mũi tên và một chuỗi mô tả mũi tên. Nếu tôi làm như vậy với chức năng (thay vì mũi tên), các công trình sau đây như mong đợi:Mũi tên Haskell bên trong Tuples
funTimes10 = (*10)
describe10 = "times 10"
tuple10 :: (Num b) => ((b -> b), String)
tuple10 = (,) funTimes10 describe10
tôi có thể truy cập vào các chức năng với fst
, và với snd
tôi nhận được chuỗi mô tả của hàm.
Tuy nhiên, nếu tôi trao đổi các chức năng với một mũi tên, giống như trong những điều sau đây:
aTuple10 :: (Arrow a, Num b) => (a b b, String)
aTuple10 = (,) (arr funTimes10) describe10
fst
vẫn hoạt động và trả về mũi tên của tôi, nhưng- tôi không nhận được bất kỳ chuỗi mô tả với
snd
.
Tôi chỉ có này lỗi thông điệp:
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)
Tại sao tôi nhận được lỗi này, và những gì tôi nên làm gì, để tránh nó?
chính xác là vậy;) thx – frosch03
Kích thích như thế nào. Người ta sẽ mong đợi hệ thống kiểu có thể kết luận rằng 'snd aTuple10' có kiểu' String'; điều này có thể được coi là một lỗi trong việc thực hiện? Chắc chắn Haskell 2010 không xác định hành vi như vậy. Người ta có thể tranh luận rằng nếu việc thực hiện không biết loại đầu tiên có, nó sẽ không biết vị trí trong bộ nhớ thứ hai là gì, nhưng vì chúng ta đang xử lý các bộ đóng hộp ở đây, nên luôn có hai con trỏ, và do đó yếu tố thứ hai có thể dễ dàng định vị bất kể loại đầu tiên. –
Một chức năng như 'lớp Boolish một nơi toBool :: a -> Bool; foo :: Boolish a => (a, b) -> b; foo (a, b) = nếu toBool a thì b else undefined' là conceivable, do đó kết quả của hàm có thể phụ thuộc vào tham số mơ hồ. Đặc biệt vỏ bọc cho 'snd' sẽ là lạ trong tình huống đó. – dflemstr