извините за поздний ответ! Я должен найти способ получить уведомление о вопросах. Хорошо, происходит две вещи, обе из которых мы должны исправить!
Во-первых, происходит что-то сбойное с
{-@ measure p :: MaybePerson -> Bool @-}
Правильный синтаксис просто
{-@ measure p @-}
p :: MaybePerson -> Bool
Но сообщения об ошибке не было, поэтому у вас нет возможности узнать!
Во-вторых, когда я изменяю вышеприведенное, я все еще получаю странную ошибку о GHC.Maybe
- я не могу вспомнитьТочная проблема прямо сейчас, будет исправлена на моем ноутбуке, но для иллюстрации я подправил ваш код:
{-@ LIQUID "--exact-data-cons" @-}
import Prelude hiding (Maybe (..))
data Maybe a = Just a | Nothing
Чтобы переопределить Maybe
. Это не нужно, мы найдем исправление КАК МОЖНО СКОРЕЕ
При этом ваш код работает как есть, например, см. Здесь
http://goto.ucsd.edu/liquid/index.html#?demo=permalink%2F1573693313_399.hs
Теперь вы можете определить
{-@ getPerson :: JustPerson -> Person @-}
getPerson (MaybePerson (Just name) (Just age)) = Person name age
и просто удалить уравнение для других случаев. Кроме того,
test1 = getPerson (MaybePerson Nothing Nothing) -- error
приводит к ошибке типа, но приведенное ниже безопасно
test2 = getPerson (MaybePerson (Just "bob") (Just 25)) -- ok
Спасибо за указание на это, исправим!