Используя привязки GNU Science Library низкого уровня Bindings.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
gsl_rng_type
здесь — просто переменная типа, поэтомуp'gsl_rng_mt19937
имеет типPtr (Ptr a)
, и ваша попытка аналогична произнесениюx <- (peek ...) :: IO (Ptr a)
. - person hammar   schedule 04.05.2015gsl_rng
_type и типомC'gsl_rng
. Я новичок в haskell и не знаком с тем, как привязки-dsl генерируют код FFI. Как мне передать значение gsl_rng_type в функцию alloc. В C это выглядит какgsl_rng *rng = gsl_rng_alloc(gsl_rng_mt19937)
. - person daj   schedule 04.05.2015castPtr
. - person hammar   schedule 04.05.2015peek
возвращаетGHC.Prim.Any
. Но мне удалось заставить работать привязки GSL с помощью castPtr, выполняющего(castPtr p'gsl_rng_mt19937) :: Ptr (Ptr C'gsl_rng_type)
. Также, к сожалению, я пришел к выводу, что bindings-gsl медленен как патока для моих нужд. Думаю, это из-за отсутствия небезопасных вызовов при генерации кода с помощью bindings-dsl. - person daj   schedule 05.05.2015x <- peek (ptr :: Ptr (Ptr a))
в приглашении ghci, переменная типаa
должна быть конкретизирована в какой-то конкретный тип. Это связано с тем, что нотация dox <- peek p
означаетpeek p >>= \x -> ...
, где..
— это то, что вы впоследствии вводите в ghci. Поскольку ghci не может знать будущее, ему приходится обманывать во время проверки типов. - person user2407038   schedule 05.05.2015