2012-01-26 13 views
8

Đôi khi, tôi chạy vào "tính năng" mà Haskell chỉ phù hợp với người đứng đầu dụ, cụ thể là,Có bất kỳ phần mở rộng ngôn ngữ hoặc hậu duệ ngôn ngữ nào của Haskell, có lợi cho tính biểu cảm, đặc biệt là trong xử lý ví dụ?

instance (a ~ NewDataTyp b) => C a 

bây giờ sẽ phù hợp với bất kỳ loại nào, tức là viết một tuyên bố thể hiện của C trong chương trình của bạn sẽ là một lỗi, ngay cả khi nó không thể xảy ra xung đột do ngữ cảnh a ~ NewDataTyp b. Đôi khi, phải mất rất nhiều nỗ lực để vượt qua; Tôi đã phải cơ cấu lại hàng trăm dòng mã để tránh giới hạn này.

Có bất kỳ phần mở rộng ngôn ngữ nào hoặc ngôn ngữ con cháu (Curry? Agda?) Được thiết kế có mức ưu tiên cao hơn cho tính biểu cảm không? Điều này có thể có thể hy sinh (a) sự cởi mở của thế giới typeclass (b) typechecking thời gian đa thức.

chỉnh sửa - cho những người quan tâm trong câu hỏi, trang này cũng có thể quan tâm: http://www.haskell.org/haskellwiki/Future_of_Haskell

+2

Xóa giả định thế giới mở dẫn đến [nhiều vấn đề hơn bạn mong đợi] (http://stackoverflow.com/questions/8728596/explicitly-import-instances/8731340#8731340). Theo như tôi biết, cách duy nhất để phục hồi từ vấn đề đó là thêm các kiểu phụ thuộc đầy đủ, và bao gồm cá thể 'Ord' đang được sử dụng trong kiểu' Set'. – ehird

+1

Kiểm tra loại Haskell không đa thức, vì việc kiểm tra loại HM là (gấp đôi) theo cấp số nhân. – augustss

+2

Tôi không chắc chắn nếu Chameleon có một phần mở rộng như vậy. Nó đòi hỏi người giải quyết ràng buộc để làm backtracking, nhưng tôi không thấy lý do nào nó không hoạt động. – augustss

Trả lời

1

Đối với những gì nó có giá trị, Scala chấp nhận bản dịch hơn hoặc ít đen của những gì bạn vừa viết. Tôi không chắc nó hữu ích như thế nào.

trait C[T] 
case class NewDataType[T]() 

implicit def letItBeInjectiveWhyNot[K[_],T]: K[T] =:= K[T] 

implicit def cIsh[A,S](implicit ev: A =:= NewDataType[S]): C[A] 
implicit def another: C[Int] 

implicitly[C[NewDataType[String]]] 
implicitly[C[Int]] 
Các vấn đề liên quan