我可以在Haskell中定义参数不相等的参数数据类型吗? [英] Can I define parametric data type where parameters are not equals between in Haskell?

查看:99
本文介绍了我可以在Haskell中定义参数不相等的参数数据类型吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题:

假设我们有一个乘客,其起点和终点分别表示为:

Let's imagine we have a Passenger with start and end points represented by:

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

问题:

如何将类约束应用于起始点不应该等于结束点的旅客?

How can I apply a class constraints to Passenger, where the start point shouldn't be equal to the end point?

PS: 我已经问过类似的针对scala的改进库

P.S.: I have asked a similar question in the Scala community, but I didn't receive any answer. Considering that refined library for scala is inspired by refined for Haskell, also hearing about liquid-Haskell, I wonder how can resolve it using Haskell?

推荐答案

我刚刚看到了这个.您可以通过在end字段上指定细化来实现,例如:

I just saw this. You can do so by specifying a refinement on the end field, e.g.:

{-@ 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

这篇关于我可以在Haskell中定义参数不相等的参数数据类型吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆