#random #agda
#Случайный #agda
Вопрос:
Мне нужно сгенерировать простое случайное число в Agda.
Я пробовал использовать фразы типа «случайное число agda», но не смог найти никакого рабочего кода.
В Haskell код будет
import System.Random
main :: IO ()
main = do
-- num :: Float
num <- randomIO :: IO Float
-- This "extracts" the float from IO Float and binds it to the name num
print $ num
результаты будут
0.7665119
или
0.43071353
Какой код Agda достигнет тех же результатов (если это возможно)?
Рабочий код будет оценен по достоинству!
Ответ №1:
Вероятно, самый простой способ — постулировать существование такого примитива, а затем объяснить Agda, как его скомпилировать с помощью COMPILE
pragma.
open import Agda.Builtin.Float
import IO.Primitive as Prim
open import IO
random : IO Float
random = lift primRandom where
postulate primRandom : Prim.IO Float
{-# FOREIGN GHC import qualified System.Random as Random #-}
{-# COMPILE GHC primRandom = Random.randomIO #-}
open import Codata.Musical.Notation
open import Function
main : Prim.IO _
main = run $
♯ random >>= λ f → ♯ putStrLn (primShowFloat f)
Я включил a main
, чтобы вы могли скомпилировать этот файл (используя agda -c FILENAME
) и запустить его, чтобы убедиться, что вы действительно получаете случайные числа с плавающей запятой.
Комментарии:
1. Я уверен, что ваше решение работает для некоторых пользователей, но я получаю это сообщение об ошибке imgur.com/a/FOMR0V9 есть какие-нибудь идеи, как заставить его скомпилироваться?
2. Это ошибка в stdlib ( github.com/agda/agda-stdlib/issues/348 ); вам необходимо обновить
3. потрясающе! как мне обновить?
4. Зависит от того, как вы установили библиотеку. Вам нужно получить версию 0.17 или новее (см. Здесь wiki.portal.chalmers.se/agda /… для получения списка совместимых версий Agda для каждой выпущенной версии stdlib)