0

Ma compréhension des monades est encore en train de se former. Je comprends qu'en plus d'être associatif, les trois autres contrats auxquels une monade doit adhérer sont identity, pure et bind.Où sont les fonctions de liaison et d'identité sur la monade Nullable <T>?

Je déduis que le constructeur de Nullable<T> forme la pure fonction, je ne vois pas de fonctions identity et bind sur Nullable<T>.

+0

Les monades sont généralement définies à l'aide de fonctions appelées 'return' et' bind', où avez-vous entendu parler de 'identity' et' pure'? – svick

+0

@svick J'ai regardé de nombreuses vidéos qui offrent toutes un lexique différent, mais les mêmes concepts. Ce que j'appelle «pur» est certainement la fonction «retour» que vous mentionnez. Je me demande où est le 'bind ', et depuis que j'ai posé la question, je pensais plus à l'implémentation de' Nullable 'et aux monades que je soupçonne qu'il n'y a pas besoin d'une méthode qui fasse la liaison mais juste que l'objet doit permettre la liaison. Je me demande quel mécanisme dans 'Nullable ' permet la liaison. –

Répondre

1

.Net ne contient pas la méthode bind pour Nullable<T>, mais il vous donne assez pour construire un vous-même:

static Nullable<T2> Bind<T1, T2>(Nullable<T1> source, Func<T1, Nullable<T2>> f) 
    where T1 : struct where T2 : struct 
{ 
    return source.HasValue ? f(source.Value) : null; 
} 

C# contient quelque chose de similaire (mais moins général) que bind: l'opérateur conditionnel null ?. . En supposant que a est de type Nullable<T1> et B est une propriété de type Nullable<T2>, alors a?.B équivaut à Bind(a, x => x.B).

+0

Ensuite, il est correct de penser que épargnant 'IEnumerable ' et ses dérivés ou duales, à savoir 'IObservable ', 'IQueryable ' et 'IQbservable ', il n'y a pas monades dans le système de type CLR qui satisfont toutes les propriétés de une monade? J'observe également que 'IEnumerable ' n'a pas 'identity' ou' return' (il a 'Empty' et' Range' mais pas 'return') alors que' IObservable 'a' Return' et l'un de ses internes classes a un 'Omega' qui retourne le dernier élément d'une seule séquence d'éléments comme lui-même. –

+0

Oh attends! 'Enumerable' a' AsEnumerable' sur le non-générique 'IEnumerable'. Mais encore, ce n'est pas 'return', qui est censé prendre un' T' et retourner un 'M '. Et il n'y a pas de foncteur 'identity' non plus .. –