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

问题描述 投票:2回答:1

问题:

让我们假设我们有一个乘客的起点和终点代表:

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

题:

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

P.S。:我在Scala社区问过类似的question,但我没有得到任何答案。考虑到refined library for scala的灵感来自refined for Haskell,也听说过液体Haskell,我想知道如何使用Haskell解决它?

haskell types type-systems refinement-type liquid-haskell
1个回答
2
投票

我刚看到这个。你可以通过在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

© www.soinside.com 2019 - 2024. All rights reserved.