Tôi đã đi sâu vào gritty nitty của hệ thống kiểu haskell và cố gắng để có được điểm tốt của các lớp kiểu. Tôi đã học được một đống, nhưng tôi đánh một bức tường trên các đoạn mã sau đây.Các kiểu hệ thống kiểu Haskell
Sử dụng những Class và thẩm định nghĩa:
class Show a => C a where
f :: Int -> a
instance C Integer where
f x = 1
instance C Char where
f x = if x < 10 then 'c' else 'd'
Tại sao nó rằng đây vượt qua kiểm tra loại:
nhưng điều này không?
g :: C a => a -> Int -> String
g x y = show(f y)
Tôi tìm thấy giải pháp thay thế thứ hai dễ đọc hơn và dường như chỉ khác biệt nhỏ (lưu ý chữ ký kiểu). Tuy nhiên, cố gắng để có được điều đó trong quá khứ typechecker kết quả trong:
*Main> :l typetests.hs
[1 of 1] Compiling Main (typetests.hs, interpreted)
typetests.hs:11:14:
Ambiguous type variable `a0' in the constraints:
(C a0) arising from a use of `f' at typetests.hs:11:14
(Show a0) arising from a use of `show' at typetests.hs:11:9-12
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `show', namely `(f y)'
In the expression: show (f y)
In an equation for `g': g x y = show (f y)
Failed, modules loaded: none.
Và tôi không hiểu tại sao.
Lưu ý: Vui lòng không hỏi "Bạn đang cố gắng làm gì?" Tôi hy vọng điều hiển nhiên là tôi chỉ rối tung trong một bối cảnh trừu tượng để thăm dò cách ngôn ngữ này hoạt động. Tôi không có mục tiêu trong tâm trí khác ngoài việc học một cái gì đó mới.
Cảm ơn
Địa ngục đẫm máu! Bài đầu tiên trên SO và tôi nhận được ba câu trả lời tuyệt vời và sâu sắc trong chưa đầy 24 giờ. Nơi này thật tuyệt vời. Cảm ơn các bạn – TheIronKnuckle