Eu coloquei uma restrição no tipo de argumento de uma função em vez de colocar no tipo de função.
Eu pensei que isso daria um erro de sintaxe ou adicionaria mais informações ao tipo da função.
Mas parece que a restrição é completamente ignorada.
{-# 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"
Isso fornece o seguinte erro de tipo:
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"
|
O que colocar uma restrição no tipo de argumento realmente faz?
EDITAR:
Por que isso precisa de RankNTypesextensão?
Não é necessário se eu remover a (Num a, Ord a) =>restrição.