Могу ли я определить параметрический тип данных, где параметры не равны между собой в Haskell?

Проблема:

Давайте представим, что у нас есть Пассажир с начальной и конечной точками, представленными:

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

Вопрос:

Как я могу применить ограничения класса к Пассажиру, где начальная точка не должна быть равна конечной точке?

PS: я задавал подобный вопрос в сообществе Scala, но не получил никакого ответа. Учитывая, что усовершенствованная библиотека для scala вдохновлена изысканной для Haskell, а также услышав о Liquid-Haskell, мне интересно, как можно решить эту проблему с помощью Haskell?

1 ответ

Решение

Я только что видел это. Вы можете сделать это, указав уточнение на 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

Другие вопросы по тегам