2015-02-19 14 views
8

Với hai chức năng:sự mặc định Generic trong Haskell

f :: (A a, B b) => a -> b 
g :: (B b, C c) => b -> c 

Có cách nào (trong GHC) tôi có thể làm cho nó có thể viết:

h x = g (f x) 

Mà không cần phải thêm một chữ ký kiểu cho f x , ví dụ

h x = g ((f x) :: T) 

Bởi có một số "kiểu mặc định" rằng f x mất nếu không chỉ định?

Tôi nghi ngờ tôi cần một cái gì đó như Defaulting in Haskell Prime nhưng điều này đã được thực hiện trong GHC (hoặc trong GHC đầu)?

+2

Theo như tôi biết, đề xuất được liên kết không được triển khai cũng như không được lên kế hoạch cho GHC; và tôi không thể nghĩ ra bất kỳ thủ thuật nào khác sẽ cho phép bạn hoàn toàn tránh thêm chú thích kiểu. [Ứng dụng loại rõ ràng] (https://ghc.haskell.org/trac/ghc/wiki/ExplicitTypeApplication), mà tôi hiểu được lên kế hoạch (nhưng không được bảo vệ) có thể giúp bạn có được cú pháp trọng lượng nhẹ hơn. Nhưng tôi không chắc chắn "Tôi không thể nghĩ ra bất cứ điều gì" thực sự đủ tiêu chuẩn như một câu trả lời ... –

Trả lời

1

ngốc phi câu trả lời:

asT :: T -> T 
asT = id 

h = g . asT . f 

Thiếu "mặc định" là một trong những nỗi đau của hương vị của Generics Haskell. Mọi thứ trở nên quá chung chung và Haskell không biết trường hợp nào cần chọn. Hiện trạng là "lập trình viên cần giải quyết rõ ràng sự mơ hồ." Thay vì chỉ định các quy tắc cấp cao nhất cho việc mặc định, bạn chỉ cần chọn cá thể thích hợp trên cơ sở từng trường hợp cụ thể. Num mặc định là một ngoại lệ hacky cho quy tắc này.

Đề xuất bạn đã liên kết có ví dụ điển hình về lý do chọn mặc định là không nhỏ khi có nhiều lớp.

default A (Int, String,()) 
default B (String, Int,()) 
(A t, B t) => t -- defaults to what? 
Các vấn đề liên quan