Haskell中的交换函数

时间:2011-10-03 16:34:48

标签: haskell

我想在haskell中编写一个函数,它不介意我以什么顺序提供它的参数,例如,我想统一这两个函数

    reproduce1 :: Male -> Female -> Child
    reproduce2 :: Female -> Male -> Child

通过一个函数'再现'。

4 个答案:

答案 0 :(得分:13)

您可以使用多参数类型类来完成此操作。

{-# LANGUAGE MultiParamTypeClasses #-}

class Reproduce x y where
  reproduce :: x -> y -> Child

instance Reproduce Male Female where
  reproduce = reproduce1

instance Reproduce Female Male where
  reproduce = reproduce2

但是,我很想知道为什么你想要这样做。

答案 1 :(得分:5)

也许您想将参数打包成数据类型并使用records(参见“标记字段”)?

   data Args = A { m :: Male , f :: Female}
   reproduce :: Args -> Child

但是,我分享了@ hammar的好奇心。

答案 2 :(得分:2)

我正在考虑这样的事情,如果两个成年人属于同一性别,就会抛出异常:

module Main where

main = putStrLn (reproduce (Male "a") (Female "b"))

type Child = String
data Adult = Male String | Female String
  deriving (Show)

reproduce :: Adult -> Adult -> Child
reproduce (Male a) (Female b) = a ++ "+" ++ b
reproduce (Female a) (Male b) = b ++ "+" ++ a

答案 3 :(得分:1)

我强烈建议修改订单,先说男性,然后是女性,或者像ShiDoSi解决方案那样制作“婚姻”数据类型。

但是,请查看文章"Fun with type functions"中的“会话类型和二元性”一节第12页 - 我认为 是一个很好的例子,你需要在对称对中耦合的类型男女