2 votes

Quelle est la meilleure façon d'améliorer Map en F# pour qu'il indique la clé lorsqu'il soulève l'exception KeyNotFound ?

Je trouve peu pratique que les cartes F# ne signalent pas la clé dans les KeyNotFoundExceptions :

let m = Map.empty<int,string>
m.[2]

>> KeyNotFoundException: The given key was not present in the dictionary. // ok, and which key?

Le problème ne se pose certainement pas dans cet exemple où la clé est présente, mais lorsque l'exception provient d'un programme en cours d'exécution. J'ai essayé d'étendre Item, mais les extensions ne remplacent pas ( https://stackoverflow.com/a/46251858/857848 )

module Ext =
    type Map<'k, 'v when 'k : comparison> with
    member o.Item k = // with better exception
        match o.TryGetValue k with
        | true, value -> value
        | false,_ -> failwithf "key not found in map: %A" k
open Ext

Je vais envelopper Map, pour que ce soit fait, mais je me demande s'il y a une alternative plus simple.

4voto

brianberns Points 727

Je ne pense pas qu'il y ait de moyen pratique de le faire, et je soupçonne que l'emballage ne soit pas une bonne solution. Map est plus ennuyeux qu'il n'en vaut la peine. J'opterais plutôt pour un opérateur personnalisé :

let (@) map key =
    match map |> Map.tryFind key with
        | Some value -> value
        | None -> failwithf "key not found in map: %A" key

let m = Map.empty<int,string>
m @ 2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X