2017-11-03 23 views
7

Trong mã sau, GHC không thể tìm thấy cá thể Functor trong định nghĩa của cá thể Monoidal.Không thể suy ra siêu lớp

Tại sao không GHC suy luận rằng cho các Applicative hạn chế được thỏa mãn, thì Functor được ở đâu đó chưa? (Là có một tên để lập luận này 'khả năng'?)

import Prelude hiding (Applicative (..), Monad (..)) 

class Functor f => Applicative f where 
    pure :: a -> f a 
    (<*>) :: f (a -> b) -> f a -> f b 

class Functor f => Monoidal f where 
    unit::f() 
    (*) ::f a -> f b -> f (a,b) 

instance Applicative f => Monoidal f where 
    unit = pure() 
    a * b = undefined 

Tôi biết có thể tất nhiên thêm một rõ ràng Functor f chế để Monoidal để không có lỗi, nhưng câu hỏi của tôi là thêm về lý do tại sao độ phân giải dụ hoạt động theo cách mà

import Prelude hiding ((*), Applicative (..), Monad (..)) 

class Functor f => Applicative f where 
    pure :: a -> f a 
    (<*>) :: f (a -> b) -> f a -> f b 

class Functor f => Monoidal f where 
    unit::f() 
    (*) ::f a -> f b -> f (a,b) 

instance (Applicative f, Functor f) => Monoidal f where 
    unit = pure() 
    a * b = (pure (,) <*> a <*> b) 

instance (Monoidal f, Functor f) => Applicative f where 
    pure x = fmap (\_ -> x) unit 
    mu <*> mx = fmap (\(f, x) -> f x) ((mu * mx) :: f (a -> b, a)) 
+2

Tôi hy vọng rõ ràng rằng một ví dụ như vậy không có ý nghĩa gì nhiều! - Tuy nhiên, câu hỏi hay, tôi cũng đã giả định trình biên dịch để cho phép điều này và tìm ra các siêu lớp. – leftaroundabout

+0

Vấn đề gốc mà tôi thấy là bạn có cả "Functor f => Monoidal f" và "Applicative f => Monoidal f". Như tôi đã hiểu, trình biên dịch chỉ cần xem một đường dẫn có thể có cho một typeclass cụ thể trên một kiểu cụ thể. – NovaDenizen

+0

@leftaroundabout bởi vì đó là một đẳng cấu ngược lại là những gì bạn có ý nghĩa? đó là lý do tại sao tôi đã đặt xuống iso, để được nhắc nhở rằng – nicolas

Trả lời

3

Trông giống như một lỗi đối với tôi. Đây là tệp tối thiểu hiển thị sự cố và không dựa vào bất kỳ hành vi nào có đổi tên Prelude nội dung hoặc undefined s.

{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE UndecidableInstances #-} 
class A x 
class A x => B x 
class A x => C x 
instance B x => C x 

Tôi khuyên bạn nên gửi lỗi trên trình theo dõi lỗi GHC với tệp này (hoặc một tệp rất thích); lý do cần thiết để khám phá rằng B x ngụ ý A x sẽ là có thể.

+1

Tôi đã báo cáo điều này là [TraC# 14417] (https://ghc.haskell.org/trac/ghc/ticket/14417) – dfeuer

+0

Và hóa ra được biết đến và chính thức mong đợi hành vi là 8.0. Kỳ dị. – dfeuer

+2

Và [bình luận này] (https://ghc.haskell.org/trac/ghc/ticket/11427#comment:4) dường như là tiền được giải, giải thích vấn đề được giải quyết bởi hành vi này. Nó khá kỹ thuật, mặc dù. –

Các vấn đề liên quan