I was working on the pangram exercise on exercism.io, and this was my solution:
    
    
    from strutils import toLowerAscii
    from sequtils import toSeq
    import sets
    
    const letters = toSeq("abcdefghijklmnopqrstuvwxyz".items).toSet()
    
    func isPangram*(text: string): bool =
        return toSet(toSeq(text.toLowerAscii().items)) >= letters
    
    
    Run

The thing is, sets doesn't even have a >= operator declared. I can't for the 
life of me find where it comes from, because if I try to explicitly import it 
from the sets package, it doesn't work.

I decided to rewrite my code to get rid of the missing operator. I also wanted 
to be a bit more explicit just to make sure the typing system isn't doing 
strange things:
    
    
    from strutils import toLowerAscii
    from sequtils import toSeq
    import sets
    
    const letters : HashSet[char] = 
toSeq("abcdefghijklmnopqrstuvwxyz".items).toSet()
    
    func isPangram*(text: string): bool =
        var mySet : HashSet[char] = toSet(toSeq(text.toLowerAscii().items))
        return sets.`<=`(letters, mySet)
    
    
    Run

So far so good, it still works. And, sets has a <= operator. So it must be 
coming from the sets package. I will try to fully qualify everything again:
    
    
    from strutils import toLowerAscii
    from sequtils import toSeq
    from sets import HashSet, toSet, `<=`
    
    const letters : HashSet[char] = 
toSeq("abcdefghijklmnopqrstuvwxyz".items).toSet()
    
    func isPangram*(text: string): bool =
        var mySet : HashSet[char] = toSet(toSeq(text.toLowerAscii().items))
        return sets.`<=`(letters, mySet)
    
    
    Run

And now it doesn't work. mySet and letters are clearly the same type, but the 
compiler complains: > C:Appsnim-0.19.4libpurecollectionssets.nim(590, 15) 
Error: type mismatch: got <HashSet[system.char]> > but expected one of: > 
iterator items[T](s: HSlice[T, T]): T > iterator items(a: cstring): char > 
iterator items[T](a: seq[T]): T > iterator items[T](a: openArray[T]): T > 
iterator items(a: string): char > iterator items[T](a: set[T]): T > iterator 
items(E: typedesc[enum]): E:type > iterator items[IX, T](a: array[IX, T]): T > 
> expression: items(s)

I'm quite confused, perhaps someone here could help me. Thank you!

Reply via email to