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

Проблема:

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

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

Вопрос:

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

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

1 Ответ

0 голосов
/ 26 февраля 2019

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

...