Không nó không phải là vô hình thành. Loại này là lạ và có lẽ không thể có bất kỳ giá trị có ý nghĩa mà nó có ý nghĩa nhưng nó vẫn được cho phép.
Hãy nhớ rằng các chữ bị quá tải. 1
là không phải một số nguyên. Đó là loại Num
. Các hàm không phải là bị loại trừ khỏi điều này. Không có quy tắc nào nói rằng a -> t
không thể là "số" (ví dụ: phiên bản Num
).
Ví dụ bạn có thể có một tuyên bố instance
như:
instance Num a => Num (a -> b) where
fromInteger x = undefined
[...]
tại 1 1
sẽ chỉ đơn giản bằng undefined
. Không phải rất hữu ích nhưng vẫn hợp lệ.
Bạn có thể có định nghĩa hữu ích của Num
cho các chức năng. Ví dụ, từ wiki
instance Num b => Num (a -> b) where
negate = fmap negate
(+) = liftA2 (+)
(*) = liftA2 (*)
fromInteger = pure . fromInteger
abs = fmap abs
signum = fmap signum
Với điều này bạn có thể viết những thứ như:
f + g
nơi f
và g
là hàm số trở về.
Sử dụng khai báo cá thể trên 1 2
sẽ bằng 1
. Về cơ bản, chữ được sử dụng làm hàm với trường hợp trên là bằng const <that-literal>
.
Nhân tiện, có bất kỳ ví dụ thực tế nào về một biểu thức như '1 2' hoặc' True 'hello "' hay '" hello "[1,2,3]' vv hữu ích không? DSL tôi đoán? –
'True' không bị quá tải - nó là một hàm tạo thực sự của' dữ liệu Bool = False | True' kiểu dữ liệu – Fraser
@ErikAllik Tôi chưa bao giờ thấy điều này được sử dụng theo cách này. Nó có thể là có thể nhưng AFAIK không được sử dụng. – Bakuriu