2012-01-27 38 views
21

Thông thường khi tôi đang chơi với mã Haskell, tôi phân phát các thứ bằng chú thích loại và undefined.Không được xác định ở cấp loại

foo :: String -> Int 
foo = undefined 

Có loại "không xác định" loại mà tôi có thể sử dụng theo cách tương tự không?

(Lý tưởng nhất, kết hợp với một loại chú thích)

type Foo :: * -> * 
type Foo = Undefined 

suy nghĩ thêm về các chủ đề tương tự: có cách nào để tôi còn sơ khai ra typeclass hợp với nhiều loại được tạo ra theo cách này? Một cách dễ dàng hơn nhiều so với cách lý thuyết sau đây?

instance Monad Foo where 
    return = undefined 
    (>>=) = undefined 

Trả lời

24

Bạn có thể sử dụng EmptyDataDecls để còn sơ khai ra một loại, và với KindSignatures bạn có thể cung cấp cho nó một loại:

{-# LANGUAGE EmptyDataDecls, KindSignatures #-} 

data Foo :: * -> * 

Bạn cũng có thể còn sơ khai ra dụ Monad mà không cần cảnh báo với tùy chọn này để GHC.

{-# OPTIONS_GHC -fno-warn-missing-methods #-} 

instance Monad Foo 

Và sau đó bạn không cần phải thực hiện bất kỳ triển khai nào cho return>>=.

+1

Tuyệt vời! Chính xác những gì tôi đang tìm kiếm; nó thậm chí còn thuận tiện hơn vì bạn không phải viết 'Foo = Undefined'! Và chữ ký loại! Awesomesauce. –

+0

Tôi tin rằng nó không giống như bí danh loại - khi bạn giới thiệu một Dữ liệu mới, không có cơ hội nào là 'Foo a = a'. Vì vậy, nó không giống như mã của câu hỏi, có thể là tốt. – gatoatigrado

+0

@gatoatigrado: Tôi nghĩ rằng yêu cầu này chỉ là một trình giữ chỗ cho một loại chưa được viết, không phải là một bí danh loại trên mỗi giây, và sau đó đây là một giải pháp thích hợp. Dù sao, vui mừng được giúp bạn Dan! – danr

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