[[BOOL, A)]]"? - Retrouvez les réponses et les commentaires concernant cette question" />
8
votes

Pourquoi "Carte (Filter FST)" Le type "[[(BOOL, A)]] -> [[BOOL, A)]]"?

J'essaie de comprendre pourquoi la fonction xxx pré>

a le type p> xxx pré>

Comment fonctionner "filtrer FST" fonctionner si filtre Doit recevoir une fonction qui renvoie un type bool et la FST vient de retourner le premier élément d'un tuple? P>

filter :: (a -> Bool) -> [a] -> [a]
fst :: (a, b) -> a


0 commentaires

6 Réponses :


2
votes

fst est une fonction qui retourne un booléen tant que vous limitez les tuples à avoir un booléen comme premier élément (le deuxième élément peut être n'importe quoi, d'où le (BOOL) )


0 commentaires

1
votes
1st arg of filter:  (Bool,b) -> Bool
fst:                (Bool,b) -> Bool

8 commentaires

Je pense que le terme que vous recherchez est la "restriction" (c'est-à-dire restreindre le type de variable de type). Le terme "unification" est utilisé dans la programmation logique. C'est une stratégie d'exécution qui fonctionne par des variables unificatrices de prédicats logiques de manière à rendre le prédicat logique vrai. Pour le dire simplement "Unification" est un processus d'essai et d'erreur. Il est utilisé pour déterminer la validité des valeurs. En revanche, la "restriction" n'est pas un processus d'essai et d'erreur. C'est comme un processus d'affectation d'un coup. Alors que les deux sont des concepts similaires, ils ne sont certainement pas les mêmes.


@AADITMSHAH: Non, c'est unification; Pour une source, Je vais fournir Wikipedia . Il n'est pas vrai que l'unification est "Essai et erreur". L'unification est, pour citer la page de redirection Wikipedia , "l'acte d'identifier deux termes avec un substitution". Vous pouvez le faire via Essai et une erreur, mais Hindley-Milner utilise un algorithme d'unification des principes. (Je pense que la programmation logique est plus particulière que "essais et erreurs" également, mais je ne connais aucun détail ici.)


@AADITMSHAH, il existe une connexion très étroite entre les systèmes de type et les logiques formelles; En conséquence, il existe une connexion très étroite entre la vérification de type et la mise en œuvre de la langue logique.


@AADITMSHAH NO, Backtracking est un processus d'essai et d'erreur. L'unification est déterministe. Vous venez d'explorer les deux branches des arbres par branche.


@Willness L'unification utilise la récupération. Ainsi, l'unification n'est pas déterministe. La programmation logique n'est pas déterministe. Si c'était déterministe, il serait la preuve que p = np. Des recherches dans le domaine de l'informatique quantique seraient rendues de théâtre, la cryptographie cline asymétrique ne serait plus sécurisée et la vérification de l'existence du lecteur d'improbabilité du Guide de Hitchhikers de la galaxie ne serait plus fallacieuse. Ne me croyez pas? Confirmez-le pour vous-même: LearningProlognow.org/...


@AaDitmshah non, c'est l'inverse. La résolution est effectuée par l'unification des termes, sélectionnée dans la base de données de programme (alias "Base de connaissances") de manière arrière. La sélection de la base de données ne fait pas partie de l'unification des termes logiques. --- Regardez votre propre lien: :) Il est dit "Maintenant que nous savons sur l'unification", c'est-à-dire que c'est décrit dans le lien Précédent .


@Willness ah, qui a évoqué mon erreur. L'unification est en effet distincte de la recherche de preuve. J'avais l'impression que les deux ne pouvaient pas être disparates.


@AaDitmshah Je vous invite à Peruse Cette réponse connexe pour votre plaisir. :)



17
votes

Comment fonctionner "Filter FST" fonctionner si le filtre doit recevoir une fonction qui renvoie un type de bool et la FST renvoie simplement le premier élément d'un tuple? P>

En un sens, vous avez répondu à votre propre question! Éliminons-le: P>

Filtre doit recevoir une fonction qui renvoie un type bool p> BlockQuote>

OK, regardons ce que vous le passez: fst code>. Est fst code> une fonction? Oui, c'est que nous avons donc la première partie. Retourne-t-il un bool code>? Eh bien, regardons ce qu'il fait: p>

FST Retourne simplement le premier élément d'un tuple p> BlockQuote>

Donc, si le premier élément d'un tuple est un bool code>, alors oui, il retourne un bool! Si le premier élément d'un tuple est autre chose qu'un bool code>, cependant, cela ne fonctionne pas et échoue à Tipecheck. P>

aperçoit un autre regard sur les types que vous avez mis en place . Je vais changer les noms des variables de type juste pour rendre les choses plus claires: p> xxx pré>

fst code> prend un (b, c ) code> et renvoie un B code> et le filtre s'attend à une fonction qui prend un A code> et renvoie un bool code>. Nous passons dans fst code>, donc le a code> ci-dessus doit être (b, c) code> car c'est le premier paramètre de FST code>. La valeur de retour de la fonction que nous passons dans filtre code> doit être un bool code>, donc b code> ci-dessus doit donc être un bool code >. Et C code> peut être n'importe quoi, car il n'est pas utilisé par le filtre. Substituer les valeurs de A code> et B code> nous donne un type final pour Filtre FST code> de: p>

map (filter fst) :: [[(Bool, c)]] -> [[(Bool, c)]]


0 commentaires

1
votes

Puisque j'ai déjà écrit cela avant que la réponse de DanielPright ait été postée, je l'affiche de toute façon. Je viens de traverser mon processus de pensée pour le type de filtre FST code> ici.

Premièrement, écrivez les signatures de type (Modifiez FST afin que ses noms de variable de type ne s'affrontent pas avec celles de Filtre): P>

filter fst :: [(Bool, c)] -> [(Bool, c)]


0 commentaires

1
votes

Vous devez vraiment juste résoudre des équations de type. Commençons:

a = [(Bool, c)]
b = [(Bool, c)]


0 commentaires

1
votes

Comme d'autres l'ont fait, je veux résoudre les équations de type ici; Mais je veux les écrire de manière plus visuelle, la dérivation peut donc être effectuée de manière plus automatique. Voyons. XXX

Stuff purement mécanique. :) avec ceci, xxx

Les variables de type dans le type final peuvent être librement renommées pour la lisibilité (de manière cohérente bien sûr).

Le La seule chose que ma réponse ajoute à ce qui a déjà été montré dans d'autres réponses ici, est ce conseil (que je pense important): Si vous suivez cette simple discipline de écrivant une chose sous l'autre Il devient très facile d'exécuter ces types d'unifications de manière très mécanique, automatiquement (réduisant ainsi la possibilité d'erreur).

Pour un autre exemple de ceci, y compris un programme de prologue de type réel, Voir HASKELLL: Comment déduire le type d'expression manuellement .


0 commentaires