Haskell, una declaración de función en una clase -- lass campo con haskell campo con polymorphism campo con instance camp Relacionados El problema

Haskell, a function declaration in a class


4
vote

problema

Español

Estoy tratando de crear algunos casos para un árbol de clase polimorfo, pero no lo entiendo,

Mira, mi código es:

  data BTree a = BLeaf a | BBranch a (BTree a) (BTree a) deriving(Show) data TTree a = TLeaf a | TBranch a (TTree a) (TTree a) (TTree a) deriving(Show)  class Tree a where      getName :: a -> a -- How should i declare this function?  instance Tree (BTree a) where      getName (BLeaf name) = name     getName (BBranch name lhs rhs) = name  instance Tree (TTree a) where      getName (TLeaf name) = name     getName (TBranch name lhs mhs rhs) = name  test1 = getName (BLeaf 1) test2 = getName (TLeaf 1)   

GHCI dice:

  Couldn't match expected type `a' with actual type `BTree a'   

Entonces, ¿cómo debo declarar la función GetName?

Original en ingles

i am trying to create some instances for a polymorph class Tree, but i dont get it,

look, my code is:

data BTree a = BLeaf a | BBranch a (BTree a) (BTree a) deriving(Show) data TTree a = TLeaf a | TBranch a (TTree a) (TTree a) (TTree a) deriving(Show)  class Tree a where      getName :: a -> a -- How should i declare this function?  instance Tree (BTree a) where      getName (BLeaf name) = name     getName (BBranch name lhs rhs) = name  instance Tree (TTree a) where      getName (TLeaf name) = name     getName (TBranch name lhs mhs rhs) = name  test1 = getName (BLeaf 1) test2 = getName (TLeaf 1) 

GHCI says:

Couldn't match expected type `a' with actual type `BTree a' 

So, How should i declare the getName-function?

           

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Utilice un parámetro de tipografía t para el constructor de tipo (como BTree o TTree , y a diferencia de BTree a y TTree a ):

  class Tree t where     getName :: t a -> a  instance Tree BTree where     getName (BLeaf name) = name     getName (BBranch name lhs rhs) = name   

Si necesita las instancias para variar según el tipo de elemento a , necesita clases de varios parámetros:

  {-# LANGUAGE MultiParamTypeClasses #-}  class Tree t a where     getName :: t a -> a  instance Tree BTree Int where     getName (BLeaf name) = name+1     getName (BBranch name lhs rhs) = name*2  instance Tree BTree Char where     getName (BLeaf name) = name     getName (BBranch name lhs rhs) = name   

Probablemente no necesites hacerlo tan general.

 

Use a typeclass parameter t for the type constructor (like BTree or TTree, and unlike BTree a and TTree a):

class Tree t where     getName :: t a -> a  instance Tree BTree where     getName (BLeaf name) = name     getName (BBranch name lhs rhs) = name 

If you need the instances to vary depending on the element type a, you need multi-parameter classes:

{-# LANGUAGE MultiParamTypeClasses #-}  class Tree t a where     getName :: t a -> a  instance Tree BTree Int where     getName (BLeaf name) = name+1     getName (BBranch name lhs rhs) = name*2  instance Tree BTree Char where     getName (BLeaf name) = name     getName (BBranch name lhs rhs) = name 

Probably you don't need to make it so general.

 
 

Relacionados problema

0  ¿Cómo actualizo un AmI de Amazon EC2?  ( How do i update an amazon ec2 public ami i created ) 
Tengo un Ami Amigón público que creé. He hecho algunos cambios en una instancia de este AMI y me gustaría actualizar el AMI público con los cambios. No estoy ...

2  C # Lista Pública de Objetos  ( C sharp public list of objects ) 
Estoy convirtiendo de VB a C # y luchando para entrenar cómo acceder a una lista pública de objetos ... class Program { public List<players> myListOfPl...

2  ¿Cómo puedo llamar a una instancia sin nombre en JavaScript? [cerrado]  ( How can i call an unnamed instance in javascript ) 
cerrado . Esta pregunta necesita detalles o claridad . Actualmente no está aceptando respuestas. ...

6  SQL 2005 Express Edition - Instale nueva instancia  ( Sql 2005 express edition install new instance ) 
Buscando una forma de manera programáticamente, o de lo contrario, agregue una nueva instancia de SQL 2005 Express Edition a un sistema que ya tiene una insta...

2  ¿Método en la instancia eliminada de la clase todavía funciona?  ( Method on deleted instance of class still work ) 
Tengo este código en Visual C ++ 2010 #include <iostream> #include <string> using namespace std; class Human { private: int magic; int health; ...

1  C #: Vacío normal y estático con el mismo nombre  ( C normal and static void with same name ) 
Quiero crear una clase de "registro". Habrá un registrador global para las cosas principales. Pero cuando la parte de la red desea registrar algo a su propio ...

2  Python DICT, la lista tiene la misma instancia para todas las clases  ( Python dict list has same instance for all classes ) 
Estoy trabajando en Python 2.7 de los últimos 3 meses y estoy realmente sorprendido después de notar esto hoy. para el siguiente fragmento de código clas...

1  Creación de objetos de clase de funciones estáticas  ( Creating class objects from static functions ) 
Supongamos que tengo un código de seguimiento. class Color { static Color a; public: static Color newColor(int r,int g,int b){ Color color; ...

0  Instancia de Objective-C en la clase C ++  ( Objective c instance into c class ) 
¿Cómo puedo crear una instancia de una clase OBJETIVO-C en la clase CPP? Por ejemplo, mi clase CPP: class Foo{ public: Foo(); private: MyObjcClas...

0  Malentendido de instancias y declaraciones  ( Misunderstanding of instances and declarations ) 
Soy un principiante completo para Java y en el proceso de crear la serpiente del juego. En el juego, he creado una clase de la junta, lo que hace esta clase e...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos