Ich habe den Typ des Arguments einer Funktion eingeschränkt, anstatt den Typ der Funktion einzugeben.
Ich dachte, dies würde entweder einen Syntaxfehler verursachen oder dem Typ der Funktion weitere Informationen hinzufügen.
Es sieht jedoch so aus, als würde die Einschränkung vollständig ignoriert.
{-# 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"
Dies ergibt den folgenden Typfehler:
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"
|
Was bedeutet es eigentlich, eine Einschränkung in den Typ des Arguments zu setzen?
BEARBEITEN:
Warum muss dies RankNTypes
erweitert werden?
Es wird nicht benötigt, wenn ich (Num a, Ord a) =>
Einschränkungen entferne .