Function 用于检查置换的Haskell函数

Function 用于检查置换的Haskell函数,function,haskell,boolean,permutation,Function,Haskell,Boolean,Permutation,如果我声明数据构造函数,例如 data City = Baltimore | Chicago | Seattle | Miami | Toronto deriving (Bounded, Enum, Eq, Ord, Show) data Name = Orioles | Cubs | Mariners | Marlins | BlueJays deriving (Bounded, Enum, Eq, Ord, Show) 如何生成函数 checkPermut

如果我声明数据构造函数,例如

data City = Baltimore | Chicago | Seattle | Miami | Toronto
        deriving (Bounded, Enum, Eq, Ord, Show)

data Name = Orioles | Cubs | Mariners | Marlins | BlueJays
        deriving (Bounded, Enum, Eq, Ord, Show)
如何生成函数

checkPermutation :: (City -> Name) -> Bool
检查两个城市是否分配了相同的团队名称。例如,以下内容将返回True,但如果将任何“名称”分配给多个城市,则将返回False

test1 :: City -> Name
test1 c = case c of
    Baltimore  -> Orioles
    Chicago    -> Cubs
    Seattle    -> Mariners
    Miami      -> Marlins
    Toronto    -> Blue Jays
试试这个:

导入数据列表(nub)
城市::[城市]
城市=[巴尔的摩..多伦多]
checkPermutation::(城市->名称)->Bool
checkPermutation f=(==长度城市)。长度。核心。f$城市地图
这基本上检查函数
f::City->Name
是否正确

事实上,我们可以创建一个更一般的
内射
谓词:

导入数据。设置为已设置
字体::(有界a、枚举a、Ord a)=>集合a
typeSet=fromList$enumFrom minBound
内射::(枚举a,有界a,序a,序b)=>(a->b)->布尔
内射f=让xs=排版(=大小xs)。尺寸。Set.map f$xs

希望这会有所帮助。

您可以通过添加
Ord
约束并使用集合而不是
nub
来提高效率(如果这是一个问题)。我是否需要将“checkPermutation f=(==length cities).length.nub.map f$cities”放在if语句中,以便以某种方式返回true或false?此外,ghci也不喜欢“cities=[Baltimore..Toronto]”,他说该部分必须用括号括起来,而不是用括号括起来scope@user2988976否,
(==length cities)
函数本身返回一个布尔值。此外,如果使用GHCi,则需要键入
let cities=[Baltimore..Toronto]