data NestedList a = Elem a | List [NestedList a]
flatten :: NestedList a -> [a]
flatten (Elem element) = [element]
flatten (List []) = []
flatten (List (first:rest)) = flatten first ++ flatten (List (rest))
main = print $ flatten $ List []
Tôi đã viết mã đã thấy ở trên trong haskell. Khi tôi thực hiện điều này với bất kỳ thông số khác, ví dụKhông có trường hợp nào cho (Hiển thị a0) phát sinh từ việc sử dụng `in 'Biến kiểu' a0 'là mơ hồ
main = print $ flatten $ List [Elem 1, Elem 2]
main = print $ flatten $ Elem 1
Nó cung cấp cho
[1, 2]
[1]
tương ứng.
Không thành công khi tôi thực thi nó bằng Danh sách trống.
main = print $ flatten $ List []
Thông báo lỗi
No instance for (Show a0) arising from a use of `print'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Show Double -- Defined in `GHC.Float'
instance Show Float -- Defined in `GHC.Float'
instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
-- Defined in `GHC.Real'
...plus 23 others
In the expression: print
In the expression: print $ flatten $ List []
In an equation for `main': main = print $ flatten $ List []
Câu hỏi
- Tại sao nó thất bại và làm thế nào tôi có thể sửa lỗi này?
- Tôi có nên thay đổi định nghĩa
NestedList
để chấp nhận số trốngList
không? Nếu vậy, làm thế nào để tôi làm điều đó. Nó khá khó hiểu.
GHC không có thông tin loại để sử dụng. Khi bạn có 'Elem 1', trong danh sách, cung cấp ràng buộc' Num a', và sau đó GHC có thể mặc định biến kiểu thành 'Integer'. Không có phần tử nào, nó không thể mặc định biến kiểu 'a0'. Cho nó một chữ ký kiểu, 'main = print $ flatten $ (List [] :: NestedList())', ví dụ, do đó trình biên dịch biết loại nào sẽ sử dụng. –
Tại sao lại là downvote? – thefourtheye