Hier sind meine bisherigen Versuche:
module Main where
data FooT = One | Two deriving (Show, Read)
{-
That is what I want
foo :: (Show a, Read a) => a
foo = One
-}
--class Footable (Show a, Read a) => a where
class Footable a where
--foo2 :: (Show a, Read a) => a
foo2 :: a
instance Footable FooT where
foo2 = One
-- test = print foo2
Ich möchte, dass der Test kompiliert wird. Ich glaube nicht, dass sich das Problem um die universelle Quantifizierung dreht. ghc sagt, dass a eine 'strict type-variable' ist editar ( starr Typ-Variable), aber ich verstehe nicht wirklich, was das ist. Die Frage scheint sich auf Folgendes zu beziehen este
bearbeiten
Wie ich in meinem Kommentar @sepp2k schrieb, geht es wahrscheinlich um den existenziellen Typ, aber ich bin über ein merkwürdiges Verhalten gestolpert:
Diese fait kompilieren:
{-# LANGUAGE OverlappingInstances, FlexibleInstances, OverlappingInstances,
UndecidableInstances, MonomorphismRestriction, PolymorphicComponents #-}
{-# OPTIONS_GHC -fno-monomorphism-restriction #-}
module Main where
class (Num a) => Numable a where
foo2 :: a
instance (Num a) => Numable a where
foo2 = 1
instance Numable Int where
foo2 = 2
instance Numable Integer where
foo2 = 3
--test = foo2 + foo2 -- This does NOT compile (ambiguous a)
test = (foo2::Integer) + foo2 --this works
aber dies nicht (`a' ist eine starre Typvariablenmeldung)
{-# LANGUAGE OverlappingInstances, FlexibleInstances, OverlappingInstances,
UndecidableInstances, MonomorphismRestriction, PolymorphicComponents #-}
{-# OPTIONS_GHC -fno-monomorphism-restriction #-}
module Main where
data FooT = One | Two deriving (Show, Read)
data BarT = Ten deriving (Show, Read)
class (Show a, Read a) => Footable a where
foo2 :: a
instance (Show a, Read a) => Footable a where
foo2 = Ten
instance Footable FooT where
foo2 = One
main = print foo2
das ist so, weil 1 :: (Num t) => t. Kann ich etwas definieren (typeconstructor, consts dunno) wie das?