Не могли бы вы немного распространить ответ?
Просто иначе - в случае если тип выводится, как V1 GHC.Prim.Any делать честный матчинг по всем конструкторам указанным в case, даже в том случае, если там есть полиморфные типы то выбирать тот, у которого конструктор подходит, а не первый подходящий при объявлении.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/71D0FEF7-59DB-457C-9221-F6BEC4135461%40gmail.com.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/CAO-1Pb4hDEuSHHeH%3DUwmMRu8AjU25GHUG2dHKroE5zp4P-_zMw%40mail.gmail.com.
Тип фунции cast принципиально не верен
> cast :: M -> SomeS -> S a
В данном случае решением было использование синглтонов для типа M и
изменение типа
cast на
> cast :: SM a -> SomeS -> S a
теперь случаи b и с невозможны. Собственно в проекте этот вариант
теперь используется,
Про viewV0:
Если мы ограничены undefined и констукруторами, то сделать логичный
view тяжеловато,
но в данном случае у меня есть функция `typeOf :: S a -> M`, которая
возвращает тип, и
благодаря этой функции я могу написать правильный view. Правда у
компилятора нету информации
об этом.
> Скорее не вереннет, это точно верно.
> data SomeS = forall a . SomeS (S a)
как написано в комментариях SomeS обозначает, что тег 'a' неизвестен
на момент компиляции (в целом, все S, которые приходят из внешней
библиотеки завернуты в SomeS, который нам принципиально незвестен),
поэтому хранить
нечего, а хранить Any - принципиально неверно.
Для того, чтобы получить 'a', который мы ожидаем и используется метод
'cast', который
а). в runtime проверит, что тип действительно соответсвует тегу,
который мы хотим проставить
и кинет error в противном случае
Cпасибо, поищу.
> Единственность реализации `viewV0 = undefined` следует примерно из
> Reynolds's parametricity theorem (я не знаю как она формулируется).
> `typeOf :: S a -> M` никак не поможет получить значение типа `V0 a`,Совсем не понял утверждения, `typeOf` не должна ничего знать о `V`,
> потому как она про V0 ничего не знает.
typeOf служит для того, чтобы в runtime узнать значение 'a', которым
протегировано 'S'.
На всякий случай переформулирую моё утверждение.
Пусть есть типы `S (a::M)` и `V (a::M)` тогда при наличии функции
`typeOf :: S a -> M`, мы можем записать `view :: S a -> V a`, такую, что для
каждого S протегированного конкретного тегом 'a', она вернёт V протегированный
тем же тегом.
В данном случае моё ожидание заключается в следующем, если S a - полиморфный,
то значит мы не можем знать, что тип view является V a, посколько V A
и V B, тоже
попадают в V a, то нужно проверять все конструкторы.
Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу haskell...@googlegroups.com.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/CAO-1Pb67xS%2BdJNzLBHi19PQzV5JBmZUsH50zJhAtpa0QgPKi2w%40mail.gmail.com.
2014-07-31 13:17 GMT+04:00 Maxim Taldykin <jor...@gmail.com>:SomeS служит для того, чтобы сделать так чтобы было принципиально невозможно
узнать про `a`. Т.к. про него ничего не известно, пример использования
foreignCall :: IO SomeS - тут мы не знаем, какой S есть, и _единственное_
валидное средство это использование `cast`
> **В рантайме нет никаких типов.**Это не верное в общем случае утверждение, и конкретно в данном.
контр-пример?
>> Пусть есть типы `S (a::M)` и `V (a::M)` тогда при наличии функции
>> `typeOf :: S a -> M`, мы можем записать `view :: S a -> V a`, такую, что
>> для
>> каждого S протегированного конкретного тегом 'a', она вернёт V
>> протегированный
>> тем же тегом.
>
>
> Для типа V0 это утверждение неверно.
Как я уже писал это исправлено в GHC-HEAD поэтому данная аргументация
>> В данном случае моё ожидание заключается в следующем, если S a -
>> полиморфный,
>> то значит мы не можем знать, что тип view является V a, посколько V A
>> и V B, тоже
>> попадают в V a, то нужно проверять все конструкторы.
>
>
> GHC считает наоборот, поэтому test0 из вашего первого письма ничего не
> выводит и вообще никаких кейсов не проверяет.
> (Не удивлюсь, если при должных гарантиях строгости и с флагом -O2 он
> превращается в `return ()`).
неприменима. Как впрочем и вообще отсылка к поведению компилятора в
случае вопроса о том, правильное ли поведение у компилятора в данном
случае.
data V1 :: M -> * whereV1b :: () -> V1 a
V1A :: Int -> V1 A
V1B :: Double -> V1 B
V1a :: () -> V1 a
test5 :: IO ()
test5 =
let s = cast A (SomeS (S 4))V1A{} -> putStrLn "1"
in case viewV1 s of
V1B{} -> putStrLn "2"
V1b{} -> putStrLn "3"
V1a{} -> putStrLn "4"
Результатом выполнения данного кода будет "4", что заставляет засомневаться
логичности отсылок к результатам тестов.
Всем спасибо за обсуждение. Указанные теоремы я обязательно почитаю
для общего развития.
В поднятом баге [1] simonpj расписал причину почему в ghc-7.8.3 поведение
было неверным, и почему исправлено в ghc-HEAD.
[1] https://ghc.haskell.org/trac/ghc/ticket/9380#comment:4
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/CAO-1Pb79aXeW3eNpZKha%2Br1MOF24yUBsSpBMcLLfd%3DRyeWvOzQ%40mail.gmail.com.
--
Alexander
--
Вы получили это сообщение, поскольку подписаны на группу Русский Haskell.
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес haskell-russi...@googlegroups.com.
Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу haskell...@googlegroups.com.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/CAO-1Pb55UZHMu6uTcit_j56qktO9VxmcbZm2LftmUqULX1W0Dg%40mail.gmail.com.
Думаю, правы те, кто намекает на undefined behavior. Надо переписать проще.Что за хтонический ужас вызвал ты из преисподней?У меня на ghc 7.6.3 test2 выдаёт "hit a CASEFAIL" в ghci.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес haskell...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/haskell-russian/CABFQQ%3DD2ofS56iq1AVLqhZHNZ90Hr6x3H-2p4UvF_h0Y0Ehc9A%40mail.gmail.com.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/CAO-1Pb7he%3DrL%2BP12ySzgKJwiXaHE0DRpo9As%3Dk47A0P4pqCmPg%40mail.gmail.com.