Là một bài tập, tôi đang thực hiện trong hoạt động 'khuyết điểm' của Haskell tạo thành một cặp từ hai giá trị thuộc bất kỳ loại nào. Thực hiện các kiểu dữ liệu cần thiết là dễ dàng đủ:A 'khuyết điểm' trong Haskell hiển thị giống như đối tượng Scheme
data Nil = Nil deriving (Eq)
data Pair a b = Cons a b deriving (Eq)
car (Cons x _) = x
cdr (Cons _ y) = y
caar = car . car
cdar = cdr . car
cadr = car . cdr
cddr = cdr . cdr
*Main> cddr (Cons 55 (Cons (1,2,3,4) "hello, world!"))
"hello, world!"
*Main>
nhưng lấy cảm hứng từ this thread, tôi muốn làm cho các cặp kết quả in ra như danh sách Scheme sẽ - bao gồm cả "danh sách không đúng" khét tiếng (1 2 3 4.). Việc triển khai của tôi (xem bên dưới) đang hoạt động đối với Char's:
*Main> Cons 'a' (Cons 'b' (Cons 'c' Nil))
('a' 'b' 'c')
*Main> Cons 'a' (Cons 'b' 'c')
('a' 'b' . 'c')
*Main> Cons (Cons 'a' 'b')(Cons 'c' (Cons 'd' Nil))
(('a' . 'b') 'c' 'd')
Nó không hoạt động tốt cho Int (hoặc bất kỳ loại dữ liệu nào khác). Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể làm cho công việc này cho các loại dữ liệu khác? ví dụ, tôi muốn nó hoạt động như thế này:
*Main> Cons 5 (Cons "hello" (Cons False Nil))
(5 "hello" False)
đầy đủ thực hiện hiện tại của tôi sau:
data Nil = Nil deriving (Eq)
data Pair a b = Cons a b deriving (Eq)
car (Cons x _) = x
cdr (Cons _ y) = y
caar = car . car
cdar = cdr . car
cadr = car . cdr
cddr = cdr . cdr
instance Show Nil where show _ = "()"
class ShowPair a where
showRight::a->String
instance (Show a, ShowPair a, ShowPair b)=>Show (Pair a b) where
show (Cons car cdr) = "(" ++ (show car) ++ (showRight cdr) ++ ")"
instance (Show a, ShowPair a, ShowPair b)=>ShowPair (Pair a b) where
showRight (Cons car cdr) = " " ++ (show car) ++ (showRight cdr)
instance ShowPair Char where
showRight x = " . " ++ show x
instance ShowPair Int where
showRight x = " . " ++ show x
instance ShowPair Nil where
showRight _ = ""
Haskell đi kèm với một thao tác có sẵn có thể tạo thành một cặp từ hai giá trị thuộc bất kỳ loại nào: '(a, b)'. Nó có thể được đánh vần '(,) a b' nếu bạn muốn có thể sử dụng nó như bạn làm một hàm. '()' sau đó lấy một phần của 'Nil' của bạn. 'car' sau đó được đánh vần' fst', và 'cdr' là' snd'. – Ben
@Ben Hiểu - Tôi biết có khả năng là tôi đang làm một số sáng chế bánh xe ở đây. Có cách nào để có được cặp sản xuất với (,) để in ra như danh sách Đề án? – gcbenison