Вопрос:

Почему `peek` с полиморфным Ptr возвращает GHC.Prim.Any при использовании с привязкой?

pointers haskell ghc ghci parametric-polymorphism

116 просмотра

1 ответ

2571 Репутация автора

Используя низкоуровневые привязки научной библиотеки GNUBindings.Gsl.RandomNumberGeneration , я сталкиваюсь с этим странным поведением типов в GHCi, где привязка меняет тип, возвращаемый из peekв GHC.Prim.Any. Я пытаюсь понять, почему, так как я не могу использовать, c'rng_allocесли я не сохраняю тип указателя на rng. Для примера:

λ> :t c'gsl_rng_alloc
c'gsl_rng_alloc :: Ptr C'gsl_rng_type -> IO (Ptr C'gsl_rng)
λ> :t p'gsl_rng_mt19937
p'gsl_rng_mt19937 :: Ptr (Ptr gsl_rng_type)
λ> :t peek p'gsl_rng_mt19937
peek p'gsl_rng_mt19937 :: IO (Ptr gsl_rng_type)
λ> x <- peek p'gsl_rng_mt19937
λ> :t x
x :: Ptr GHC.Prim.Any
λ> c'gsl_rng_alloc x

<interactive>:421:17:
    Couldn't match type ‘GHC.Prim.Any’ with ‘C'gsl_rng_type’
    Expected type: Ptr C'gsl_rng_type
      Actual type: Ptr GHC.Prim.Any
    In the first argument of ‘c'gsl_rng_alloc’, namely ‘x’
    In the expression: c'gsl_rng_alloc x
λ> 

Попытка явно указать тип возвращаемого результата, который тоже не помогает:

λ> x <- (peek p'gsl_rng_mt19937) :: IO (Ptr gsl_rng_type)
λ> :t x
x :: Ptr GHC.Prim.Any
Автор: daj Источник Размещён: 04.05.2015 05:18

Ответы (1)


3 плюса

19657 Репутация автора

Решение

Чтобы немного расширить комментарий @ user2407038:

Когда вы делаете x <- peek (ptr :: Ptr (Ptr a))в приглашении GHCi, переменная типа aдолжна быть создана для какого-то конкретного типа. Это связано с тем, что doобозначение x <- peek pозначает peek p >>= \x -> ..., где ...вы вводите GHCi впоследствии. Поскольку GHCi не может знать будущее, он должен «обманывать» во время проверки типов.

Напомним peek p >>= \x -> ..., что правый аргумент in , >>=а именно лямбда-абстракция \x -> ..., является мономорфным по своему аргументу . Вот почему GHCi должен присвоить мономорфный тип x.

GHC.Prim.Any это тип заполнителя, который GHC использует в подобных ситуациях, когда конкретный мономорфный тип должен быть назначен чему-то, что не имеет других ограничений.

Автор: Cactus Размещён: 29.07.2016 02:53
Вопросы из категории :
32x32