如何在Haskell中简化此函数?

如何在Haskell中简化此函数?,haskell,functional-programming,pattern-matching,Haskell,Functional Programming,Pattern Matching,我认为以这种方式编写代码是多余的。无论类型构造函数是什么,返回值都是相同的。是否有一种方法可以一次性写入返回值 data End = Leftend (Int,Int) | Rightend (Int, Int) deriving (Eq, Ord, Show) cmp:: End->End->Ordering cmp (Leftend (l, h1)) (Rightend (r,h2)) | l < r = LT

我认为以这种方式编写代码是多余的。无论类型构造函数是什么,返回值都是相同的。是否有一种方法可以一次性写入返回值

data End = Leftend (Int,Int) | Rightend (Int, Int)
            deriving (Eq, Ord, Show)


cmp:: End->End->Ordering
cmp (Leftend (l, h1))  (Rightend (r,h2))
        | l < r = LT
        | l == r = EQ
        | l > r = GT
cmp (Leftend (l, h1))  (Leftend (r,h2))
        | l < r = LT
        | l == r = EQ
        | l > r = GT
cmp (Rightend (l, h1))  (Rightend (r,h2))
        | l < r = LT
        | l == r = EQ
        | l > r = GT
cmp (Rightend (l, h1))  (Leftend (r,h2))
        | l < r = LT
        | l == r = EQ
        | l > r = GT
data End=Leftend(Int,Int)| Rightend(Int,Int)
推导(Eq、Ord、Show)
cmp::结束->结束->订购
cmp(左端(l,h1))(右端(r,h2))
|lr=GT
cmp(左端(l,h1))(左端(r,h2))
|lr=GT
cmp(右端(l,h1))(右端(r,h2))
|lr=GT
cmp(右端(l,h1))(左端(r,h2))
|lr=GT
我想

import Data.Ord

discard :: End -> (Int, Int)
discard (Leftend v) = v
discard (Rightend v) = v

cmp :: End -> End -> Ordering
cmp = comparing (fst . discard)
我想

import Data.Ord

discard :: End -> (Int, Int)
discard (Leftend v) = v
discard (Rightend v) = v

cmp :: End -> End -> Ordering
cmp = comparing (fst . discard)

这并不完全是重复的,但在很大程度上与相同。我建议将数据声明重构为
data-Side=Left | Right;数据结束=结束{side::side,width::Int,height::Int}
或类似内容。然后
cmp=comparing width
,甚至可能不值得给它起个名字。对于初学者来说,这种不断出现的模式
|lr=GT
只是
comparise l-r
这并不是完全重复的,我建议将数据声明重构为
dataside=Left | Right;数据结束=结束{side::side,width::Int,height::Int}
或类似内容。然后
cmp=comparing width
,甚至可能不值得为其命名。对于初学者来说,不断出现的这种模式就是
comparise lr=GT