Y a-t-il une notion de qualité du pointeur dans Haskell? == Nécessite que les choses qui dérivent EQ, et j'ai quelque chose qui contient une valeur (valeur -> io), ni ni -> ni io dérive eq.
éditer: je crée un interprète pour une autre langue qui Est-ce que em> avez l'égalité du pointeur, alors j'essaie de modéliser ce comportement tout en pouvant utiliser des fonctions HASKELL pour modéliser des fermetures. P> EDIT: Exemple: je veux une fonction spéciale code> qui ferait ceci: p>
6 Réponses :
iOREFS dérive eq. Je ne comprends pas ce dont vous avez besoin pour obtenir l'égalité du pointeur de. P>
Edit: Les seules choses qu'il est logique de comparer l'égalité du pointeur de structures mutables. Mais comme je l'ai mentionné ci-dessus, des structures mutables, comme iorefs, déjà une instance Eq, qui vous permet de voir si deux iOREF sont la même structure, ce qui est exactement l'égalité du pointeur. P>
Désolé, j'ai corrigé ma question. Io ne dérive pas l'équation et ne fonctionne pas non plus. Je tiens à tester si deux fonctions sont la même fonction.
Mais iOS ne sont pas des "pointeurs". Je ne vois pas ce que cela signifierait de les comparer. Pouvez-vous donner un exemple?
Vous ne pouvez pas comparer deux fonctions pour voir si elles sont identiques. Par exemple, je pouvais écrire "foo x = 2 * x" et "bar x = x + x". Il est clair que FOO et la barre sont égales car pour tous les X, FOO X == Bar X, mais dans le cas général, il est indécitable. Je sais que ce n'est pas tout à fait ce que tu voulais; Vous voulez une comparaison "peut être des fonctions différentes". Mais non, Haskell n'a pas ça.
Question connexe sur la non-détidabilité de l'équivalence de la fonction: Stackoverflow.com/Questtions/1132051/...
Je me rends compte qu'il est indécitable de voir si deux fonctions produisent toutes les sorties données au même ensemble d'entrées. Voir mon poste mis à jour
L'égalité du pointeur briserait Transparence référentielle , donc non. P>
Peut-être surprenant, il est en fait possible Pour calculer Equalalité d'extension de fonctions totales sur espaces compacts , mais en général (par exemple, fonctions sur les entiers avec une éventuelle non-résiliation), cela est impossible. P>
Edit: Je crée un interprète pour une autre langue p> blockQuote>
Pouvez-vous simplement conserver le programme d'origine AST ou l'emplacement de la source à côté des fonctions Haskell que vous avez traduites? Il semble que vous souhaitiez "égalité" en fonction de cela. P>
Je suis à peu près sûr que les phrases égalité d'extension code> et
topologie compacte code> ne sont pas dans le jargon commun.
les phrases égalité de l'extension code> et
topologie compacte code> sont les phrases qui empêchent de garder moi d'essayer haskell
Lien intéressant. Ma première pensée était "Ce gars parle des ordures." Mais nous ne parlons pas de fonctions générales, nous parlons de Computable i> fonctions. Cela fait toute la différence.
@Otto: Ces phrases concernent l'égalité de calcul des fonctions en général, elles s'appliquent donc à toutes les langues. Ils ne sont pas spécifiques à Haskell.
Si vous implémentez un interprète pour une autre langue, donnez simplement un identifiant unique à chaque fonction. Ex: Changer {Fonction Data = Fonction {Args :: Arglist, Expr :: Expression} à {Fonction Data = Fonction {Args :: Arglist, Expre :: Expression, uniqueID :: int}} et attribuer des ID par ordre d'instanciation
== nécessite que les choses dérivent EQ P>
effectivement
(==) code> nécessite une instance em> de EQ, pas nécessairement une instance em> em>. Ce que vous avez probablement besoin de faire est de fournir votre propre instance d'égaliseur qui ignore simplement la valeur
(valeur -> io) code> partie. E.g., P>
data D = D Int Bool (Value -> IO Value) instance Eq D where D x y _ == D x' y' _ = x==x && y==y'
Ça fait, et je l'ai fait pour l'instant
Oui, x == x ' code> est ce que je voulais dire.
EDIT STROND>: Compte tenu de votre exemple, vous pouvez le modeler avec l'IO monade. Il suffit d'assigner vos fonctions à iOREFS et de les comparer.
Je veux juste voir si deux fonctions que je reçois sont en fait la même fonction. J'essaie de créer un interprète pour une autre langue qui a l'égalité du pointeur, et je veux immerger ce comportement.
Mais que signifie "la même fonction" signifie exactement? (\ x -> x) est la même fonction que (\ x -> x). La même fonction que (((\ x y -> y) x), etc. Je pense que ce dont vous avez besoin est une donnée supplémentaire pour suivre "l'adresse" d'une fonction dans votre langue interprétée. Une monade qui modélise une coalgebra A -> (int, a) pourrait être en ordre.
Malheureusement, nous avons le cas evil = id {unid = const non défini} également, donc votre exemple n'est pas 100% vrai. Ces fonds pestains. :)
Eh bien, oui, si vous introduisez une absurdité ou une récursion infinie, c'est votre faute.
Je crée un interprète pour une autre langue qui a l'égalité du pointeur, alors j'essaie de modéliser ce comportement tout en étant toujours capable d'utiliser des fonctions de haskell pour modéliser fermetures. p> blockQuote>
Je suis à peu près sûr que pour écrire un tel interprète, votre code devrait être monadique. Vous n'avez pas à maintenir une sorte d'environnement ou d'état? Si tel est le cas, vous pouvez également maintenir un compteur pour la fermeture de la fonction. Ainsi, chaque fois que vous créez une nouvelle fermeture, vous l'équipez avec un identifiant unique. Puis pour l'équivalence du pointeur, vous comparez simplement ces identifiants. P>
Une autre façon de faire cela est d'exploiter Stablenames. P>
Cependant, SPÉCIAL devrait renvoyer ses résultats à l'intérieur de l'IO MONAAAD, à moins que vous ne souhaitiez abuser de l'îleferformio. P>
La solution iOREF nécessite Io tout au long de la construction de votre structure. Vérification des stabilistes l'utilise uniquement lorsque vous souhaitez vérifier l'égalité référentielle. P>
C'est une assez bonne solution pour vérifier l'égalité de la fonction, même si stabloname code> n'est pas toujours équivalent quand il semble qu'ils puissent être. Je voulais juste ajouter un lien vers les docs: Hackage.hakell.org/package/base-4.7.0.2/docs/...