我想在haskell中编写一个函数,它不介意我以什么顺序提供它的参数,例如,我想统一这两个函数
reproduce1 :: Male -> Female -> Child
reproduce2 :: Female -> Male -> Child
通过一个函数'再现'。
答案 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页 - 我认为 是一个很好的例子,你需要在对称对中耦合的类型男女