[Haskell-cafe] Re: Perl-ish =~ operator

ozone at algorithm.com.au ozone at algorithm.com.au
Tue Feb 24 01:57:41 EST 2004

On 24/02/2004, at 1:30 AM, Andre Pang wrote:

> In my effort to turn Haskell into a language more like Perl 
> (muahaha)[1], I got a bit fed up and implemented something like Perl 
> 5's =~ binding operator (a.k.a. "regex" operator); I thought maybe 
> somebody else here might find it useful.  Perl has the concept of 
> 'contexts': a function does something different depending on what type 
> its caller expects back from the function.  Sounds like a perfect 
> abuse of type classes, to me :).

And, just for kicks, here's Perl 6's "smart match" (~~) operator, which 
works much like ==, but in a more "Do What I Mean!" fashion, matching 
any type to any other type:

{-# OPTIONS -fglasgow-exts -fallow-undecidable-instances 
-fallow-overlapping-instances #-}

module SmartMatch where

import Text.Regex

class TruthValue a where
   truth :: a -> Bool

instance TruthValue Bool where
   truth = id

instance TruthValue Int where
   truth 0 = False
   truth _ = True

instance TruthValue String where
   truth "" = False
   truth _  = True

instance TruthValue a => TruthValue [a] where
   truth = all truth

class SmartMatch a b where
   (~~) :: a -> b -> Bool

instance Eq a => SmartMatch a a where
   a ~~ b = a == b

instance SmartMatch c d => SmartMatch d c where
   a ~~ b = b ~~ a

instance TruthValue a => SmartMatch Bool a where
   a ~~ b = a == truth b

instance SmartMatch String Regex where
   s ~~ re = case matchRegex re s of
     Nothing -> False
     Just x -> True

% Andre Pang : trust.in.love.to.save

More information about the Haskell-Cafe mailing list