Могу ли я определить параметрический тип данных, где параметры не равны между собой в 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"
Вы можете играть с этим онлайн здесь: