2015-04-22 16 views
5

Với một kiểu, chỉ có một cách rõ ràng để thực hiện một cá thể Additive, từ thư viện Tuyến tính, đến thư mục đó. Thuận tiện, Additive có cài đặt chung, vì vậy chúng tôi có thể sử dụng deriving cho nó. Thật không may, nó phụ thuộc vào sự tồn tại của một Applicative dụ, mà không phải là derivable, vì vậy bạn vẫn phải khai báo nó:Làm thế nào để lấy được Phụ gia chung trên Haskell, mà không định nghĩa một cá thể Ứng dụng?

{-# LANGUAGE DeriveGeneric, DeriveFunctor #-} 

import Linear 
import GHC.Generics 
import Control.Applicative 

data Foo a = Foo a a a deriving (Show, Functor, Generic1) 

instance Additive Foo 

instance Applicative Foo where 
    pure x = Foo x x x 
    Foo f g h <*> Foo x y z = Foo (f x) (g y) (h z) 

main = print $ Foo 1 2 3 ^+^ Foo 4 5 6 

Có cách nào để lấy được Additive tự động, mà không cần phải khai báo một thể hiện applicative?

Trả lời

1

số

Ví dụ kinh điển của một kiểu dữ liệu trong đó có hai cách hoàn hảo cromulent Applicative trường là []/ZipList. Điều này chứng minh rằng một nguồn gốc chung của Applicative cho [] sẽ cần phải bằng cách nào đó chọn một hoặc khác, khi trên thực tế không có sự lựa chọn nào hợp lệ hơn giá trị kia.

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