Tôi đặt một ràng buộc trong kiểu đối số của hàm thay vì đặt kiểu của hàm.
Tôi nghĩ rằng điều này sẽ cung cấp một lỗi cú pháp hoặc thêm thông tin vào loại hàm.
Nhưng có vẻ như các ràng buộc hoàn toàn bị bỏ qua.
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RankNTypes #-}
test :: a -> String
test (n :: (Num a, Ord a) => a) =
if n > 10 then "Hello"
else "World"
main = print "Hello World"
Điều này đưa ra lỗi loại sau:
Test3.hs:6:8: error:
• No instance for (Num a) arising from a use of ‘n’
Possible fix:
add (Num a) to the context of
the type signature for:
test :: forall a. a -> String
• In the first argument of ‘(>)’, namely ‘n’
In the expression: n > 10
In the expression: if n > 10 then "Hello" else "World"
|
6 | if n > 10 then "Hello"
| ^
Test3.hs:6:8: error:
• No instance for (Ord a) arising from a use of ‘>’
Possible fix:
add (Ord a) to the context of
the type signature for:
test :: forall a. a -> String
• In the expression: n > 10
In the expression: if n > 10 then "Hello" else "World"
In an equation for ‘test’:
test (n :: (Num a, Ord a) => a)
= if n > 10 then "Hello" else "World"
|
6 | if n > 10 then "Hello"
|
Điều gì đặt một ràng buộc trong kiểu của đối số thực sự làm gì?
BIÊN TẬP:
Tại sao điều này cần RankNTypes
mở rộng?
Nó không cần thiết nếu tôi loại bỏ (Num a, Ord a) =>
ràng buộc.