LINUX.ORG.RU

История изменений

Исправление qnikst, (текущая версия) :

если же ты про:

import Control.Monad.IO.Class
import System.IO.Unsafe

instance MonadIO Maybe where
  liftIO f = let r = unsafePerformIO f 
             in r `seq` Just r

test :: a -> Maybe a
test a = do
  liftIO (putStrLn "hacked")
  return a

то приходи, тогда, когда ты перепишешь это без UnsafePerformIO, а для защиты от подобных хаков есть SafeHaskell.

Заметь, приведенный код очень сильно сужает объект рассмотрения и проблематики. Правда данная проблема относится к трансформерам чуть менее, чем никак. А к quickcheck ещё меньше.

Исправление qnikst, :

если же ты про:

import Control.Monad.Identity
import Control.Monad.IO.Class
import Control.Monad.Trans.Maybe

import System.IO.Unsafe

instance MonadIO Maybe where
  liftIO f = let r = unsafePerformIO f 
             in r `seq` Just r

test :: a -> Maybe a
test a = do
  liftIO (putStrLn "hacked")
  return a

то приходи, тогда, когда ты перепишешь это без UnsafePerformIO, а для защиты от подобных хаков есть SafeHaskell.

Заметь, приведенный код очень сильно сужает объект рассмотрения и проблематики. Правда данная проблема относится к трансформерам чуть менее, чем никак. А к quickcheck ещё меньше.

Исправление qnikst, :

если же ты про:

import Control.Monad.Identity
import Control.Monad.IO.Class
import Control.Monad.Trans.Maybe

import System.IO.Unsafe

instance MonadIO Maybe where
  liftIO f = let r = unsafePerformIO f 
             in r `seq` Just r

test :: a -> Maybe a
test a = do
  liftIO (putStrLn "hacked")
  return a

то приходи, тогда, когда ты перепишешь это без UnsafePerformIO, а для защиты от подобных хаков есть SafeHaskell.

Заметь, приведенный код очень сильно сужает объект рассмотрения и проблематики. Правда данная проблема относится к трансформерам чуть менее, чем никак.

Исходная версия qnikst, :

если же ты про:

import Control.Monad.Identity
import Control.Monad.IO.Class
import Control.Monad.Trans.Maybe

import System.IO.Unsafe

instance MonadIO Maybe where
  liftIO f = let r = unsafePerformIO f 
             in r `seq` Just r

test :: a -> Maybe a
test a = do
  liftIO (putStrLn "hacked")
  return a

то приходи, тогда, когда ты перепишешь это без UnsafePerformIO, а для защиты от подобных хаков есть SafeHaskell.