?

Log in

No account? Create an account

Заповедник репрессивной психиатрии

Епический стыд
metaclass
Пытался написать прогу на хаскеле, которая читает файл, обрабатывает его и дописывает в его конец новую строку. Тут же напоролся на lazy i/o и то, что после hClose файл уже не читается, а до hClose файл нельзя открыть на запись. C readFile аналогично.

Кстате, что-то я в System.IO совсем не вижу вариаций openFile с ShareRead/ShareWrite, оно что ле вообще не предусмотрено?

Забавная хрень
metaclass
В обычных языках параметры, которые содержат дефолтные значения, нужно запиливать в конец списка параметров, иначе не скомпилируется. Т.е что-то вроде strToIntDef(s:string;default:integer=0);

В хаскеле сия привычка вылазит боком, так как сделать из функции с полным набором параметров функцию с дефолтными можно частичным ее применением, а для этого нужно чтобы параметры, которые часто используются с дефолтными значениями были в начале, иначе объявления получаются слишком многословные или приходится использовать всякие flip:
strToIntDef:: String -> Int -> Int
...
strToIntDef' x = strToIntDef x 0

а вот если сделать так, то получается гуманно, и можно вообще вторую функцию не объявлять, а использовать сразу (strToIntDef 0) где нужно
strToIntDef:: Int -> String -> Int
...
strToIntDef' = strToIntDef 0

OutputDebugString
metaclass
Ради тренировки мозга сделал модуль на хаскеле с функциями для трассировки с помощью виндовской OutputDebugString:
ODS

FFI не так уж и пугающе выглядит. Хотя насчет того, не умрет ли это все в многопоточном приложении, если вызвать unsafe версии - уверенности никакой нет.


module ODSTrace (trace) where

import System.IO.Unsafe
import Foreign.C.String

putTraceMsg :: String -> IO ()
putTraceMsg msg = do
withCString msg $ \cmsg ->
ods cmsg

foreign import stdcall unsafe "windows.h OutputDebugStringA"
ods :: CString -> IO ()

trace :: String -> a -> a
trace string expr = unsafePerformIO $ do
putTraceMsg string
return expr

Мозг съеден хаскелем
metaclass
Подскажите, опытные хаскель-гуру, есть ли у Data.ByteString и Data.ByteString.Lazy какой-нибудь общий typeclass, чтобы можно было писать функции работающие с обоими видами строк?

А то я тут балуюсь с бинарной сериализацией и чтобы посмотреть результат, сделал модуль с функциями типа showHexString, но чтобы ее применить к обоим вариациям ByteString, пришлось сделать обобщающий их собственный класс. Нутром чую - должен быть такой готовый класс, но не нашел.