4 Stimmen

Beschränkung des Rückgabetyps auf einen Context

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X