我可以定义参数不等于 Haskell 的参数数据类型吗?

Can I define parametric data type where parameters are not equals between in Haskell?

问题:

假设我们有一个 Passenger,起点和终点表示为:

data Passenger a = Passenger { start :: a
                               , end :: a
                             }

问题:

如何对 Passenger 应用 class 约束,其中起点不应等于终点?

P.S.: 我问过类似的 question in the Scala community, but I didn't receive any answer. Considering that refined library for scala is inspired by refined for Haskell,也听说过 liquid-Haskell,我想知道如何使用 Haskell?

解决它

我刚看到这个。您可以通过在 end 字段上指定细化来做到这一点,例如:

{-@ data Passenger a = Passenger 
      { start :: a
      , end   :: {v:a | v /= start} 
      } 
  @-}

data Passenger a = Passenger 
  { start :: a
  , end   :: a
  }                        

ok :: Passenger String 
ok = Passenger "Alice" "Jones"

bad :: Passenger String
bad = Passenger "Bora" "Bora"

你可以在这里在线玩这个:

http://goto.ucsd.edu:8090/index.html#?demo=permalink%2F1551137259_16583.hs