WebHU - Programozási kérdések és válaszok

Hogyan használhatok egy példánykényszer funkcionális függősége által meghatározott típusparamétert egy társított típuscsalád egyenletének RHS-eként?

Van egy ilyen típusú osztályom:

class (Coercible a b) => Foo a b | a -> b

Szeretném deklarálni a Generic következő példányát:

data Thing a
  where
  Thing :: Foo a b => b -> Thing a

-- If the @b@ uniquely determined by @a@ is @Generic@, so is @Thing a@ ...
instance (Foo a b, Generic b) => Generic (Thing a)
  where
  type Rep (Thing a) = Rep b

Sajnos ez nem fordítható le, a hibaüzenet a következő:

[typecheck] [E] • Type variable ‘r’ is mentioned in the RHS,
    but not bound on the LHS of the family instance
• In the type instance declaration for ‘Rep’
  In the instance declaration for ‘Generic (UnvalidatedData v)’

Tudom, hogy amit akarok, az szemantikai szinten lehetséges, mert ha funkcionális függőség helyett típuscsaládot használok a következőképpen:

class (Coercible a (B a)) => Foo' a
  where
  type B a :: Type

Kijelenthetem:

data Thing a
  where
  Thing :: Foo' a => B a -> Thing a

-- If the @B a@ uniquely determined by @a@ is @Generic@, so is @Thing a@ ...
instance (Foo' a, Generic (B a)) => Generic (Thing a)
  where
  type Rep (Thing a) = Rep (B a)

Sajnos a társított típuscsaládok egyáltalán nem jelennek meg a típusosztályok típusaiban, így nem lehetséges magasabb rendű érvelés a társított típuscsaládok felett az osztályok áthaladásakor. Emiatt a típuscsalád helyett inkább funkcionális függőséget használnék.

Mi (ha van) a legközelebbi működő közelítése Foo, Thing és Thing Generic példányának, amely többparaméteres típusosztályt használ?


  • Mi a helyzet mindkettő használatával? Vagyis lehet class (Coercible a b, b ~ B a) => Foo a b | a -> b where type B a :: Type, és alapértelmezés szerint type B a = b. Elismerem, nem túl elegáns, de lehetővé teszi a többparaméteres típusú osztály használatát és a b közvetlen elérését a a-ből. 09.01.2021

Válaszok:


1

A legjobb, amit fel tudok hozni, hogy mind a funkcionális függőségeket, mind a típuscsaládot használom, és megpróbálom a mindkét világból legjobb helyzetet kialakítani:

class (Coercible a b, b ~ B a) => Foo a b | a -> b where
  type B a :: Type

data Thing a where
  Thing :: Foo a b => b -> Thing a

instance (Foo a b, Generic b) => Generic (Thing a) where
  type Rep (Thing a) = Rep (B a)

Nem túl elegáns, de a b ~ B a használata a Foo korlátozásában azt jelenti, hogy nem lehet véletlenül elrontani a Foo példányait. Például írhatod:

instance Foo (Sum a) a where
  type B (Sum a) = a

de ha megpróbálod írni, mondjuk, hogy type B (Sum a) = Int, akkor egy arising from the superclasses of an instance declaration hibaüzenetet kapsz.

09.01.2021
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..