ryani.spam at gmail.com
Wed Jan 19 11:41:22 CET 2011
I don't think that's exactly what you want, though. name (2::Int)
crashes your program.
I think you really want a data type.
data Person a b = P a b
pid :: Person a b -> a
pid (P a _) = a
pname :: Person a b -> b
pname (P _ b) = b
Now, what it looks like you want is some kind of extensible relation
name 1 = "john"
name 2 = "julie"
but there's no simple way to specify this as an open function at the
value level. You can make a list of all the people:
people = [ P 1 "john", P 2 "julie" ]
name :: Int -> Maybe String
name x = fmap pname $ safeHead $ filter ((== x) . pid) people
safeHead  = Nothing
safeHead (x:_) = Just x
It's still not really clear what you are trying to do.
On Mon, Jan 17, 2011 at 9:15 AM, Patrick Browne <patrick.browne at dit.ie> wrote:
> A functional dependency seems to allow me to express my rather strange
> class Person i n | i -> n where
> pid :: i
> name :: i -> n
> instance Person Int String where
> pid = 1
> name(1) = "john"
> -- name(pid::Int) will produce john
> Thanks for your help
> On 17/01/2011 14:07, Patrick Browne wrote:
>> On 17/01/2011 13:04, Ketil Malde wrote:
>>>> So other PERSONs would have different types, say:
>> I think the problem is there is just one constant p1 in the class and
>> there needs to be multiple constants in the implementation (one for each
>> person). It seems difficult to specify this using type classes So, some
>> data declaration as you suggest will probably be needed.
>> This message has been scanned for content and viruses by the DIT Information Services E-Mail Scanning Service, and is believed to be clean. http://www.dit.ie
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
> This message has been scanned for content and viruses by the DIT Information Services E-Mail Scanning Service, and is believed to be clean. http://www.dit.ie
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
More information about the Haskell-Cafe