ru_lambda, posts by tag: haskell - LiveJournal (original) (raw)

Как сделать ЭТО без FlexibleContexts ? [Oct. 11th, 2014|09:34 pm]Лямбда - функциональное программирование
[**Tags**|haskell, typefamilies]{-# Language TypeFamilies, FlexibleContexts #-} module Main where import qualified Data.List as L class (Num (Elem c)) => DataSet c where type Elem c :: * data TObservation c :: * observations :: c -> [TObservation c] measurements :: TObservation c -> [Elem c] instance DataSet () where type Elem () = Float data TObservation () = TObservationUnit [Float] observations () = replicate 10 (TObservationUnit [0,0,0,0]) measurements (TObservationUnit xs) = xs kMeans :: DataSet c => c -> [TObservation c] kMeans s = undefined where wtf1 = L.foldl wtf2 0 (observations s) wtf2 acc xs = acc + L.sum (measurements xs) main = do putStrLn "jopa" Если убрать FlexibleContexts в частности на Num (Elem c) - то собираться перестанет,выведение типов отсыхает.Как это делать без FlexibleContexts или как это вообще делать правильно?
link 10 comments|post comment
Пакеты программ на haskell под RHEL [May. 3rd, 2013|02:38 am]Лямбда - функциональное программирование
[**Tags**|haskell, linux, rhel, rpm]Всем доброго времени суток!На всякий случай напишу, что готов помочь в сборке пакетов программ на haskell под RHEL 5/6 32/64. Вдруг кому-то будет нужно.Метод подходит только для исполняемых программ, не подходит для библиотек. На выходе получается бинарник, скомпилированный статически со всеми хаскельными библиотеками, упакованный в rpm. В пакете прописаны все необходимые зависимости от разделяемых сишных библиотек.То есть конечному пользователю не нужно знать ничего о хаскеле, не нужно устанавливать никакие хаскельные зависимости.
link post comment
Я не понимаю Type Classes [May. 1st, 2013|11:51 pm]Лямбда - функциональное программирование
[**Tags**|fprog, haskell, incoherent instances, incoherentinstances, type classes]Копая расширяемые записи для Haskell столкнулся с проблемой.мне нужна функция:cast' :: ISubset fs' fs => PlainRec fs -> PlainRec fs'тривиально это будет:cast' = castно компилятор говорит: Could not deduce (PlainRec fs <: PlainRec fs') arising from a use of `cast' from the context (ISubset * fs' fs) Правильно ли я понимаю, что хотя и для конкретных fs и fs' можно с легкостью подобрать экземпляры (из файла), но для случая функции cast' они как-бы общие, и через это оно не компилируется?Можно добавить экземпляр для общего случая и как бы спрятать все эти выведения внутри функций, но правильно ли это, так как если добавить экземпляр для общего случая появляется ошибка с текстом: (The choice depends on the instantiation of fs, fs' To pick the first instance above, use -XIncoherentInstances when compiling the other instance declarations) Это оно мне предлагает изменить библиотеку?Подскажите, пожалуйста, что делают в таких ситуациях.Не понимаю где нужно копать и какой лопатой.Спасибо!UPDATE [Самая-самая] изначальная проблема решилась, то есть потребность в функции cast' отпала. Но все равно хотелось бы услышать мысли по-этому поводу.
link 2 comments|post comment
Как дебажить FFI? [Dec. 7th, 2012|02:47 am]Лямбда - функциональное программирование
[**Tags**|ffi, haskell]Пару лет назад написал привязку к библиотеке pam, чтобы можно было по паролю рута или другого системного юзера авторизовываться. Для утилит всяких.Качество кода на уровне "чтоб хоть как-то работало", но есть и приятный момент. Все два года оно работало как надо, без проблем.Без проблем до сегодняшнего дня, когда я решил поюзать эту библиотеку в Centos 5 i686# uname -a Linux centos5-32 2.6.18-308.20.1.el5 #1 SMP Tue Nov 13 10:16:17 EST 2012 i686 athlon i386 GNU/Linux И получил в своём приложении segfault. Как-то так:$ ghci System/Posix/PAM.hs GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. [1 of 3] Compiling System.Posix.PAM.Types ( System/Posix/PAM/Types.hs, interpreted ) [2 of 3] Compiling System.Posix.PAM.LowLevel ( System/Posix/PAM/LowLevel.hs, interpreted ) [3 of 3] Compiling System.Posix.PAM ( System/Posix/PAM.hs, interpreted ) Ok, modules loaded: System.Posix.PAM, System.Posix.PAM.LowLevel, System.Posix.PAM.Types. *System.Posix.PAM> authenticate "test" "sdf" "sdef" Loading package pam-0.1 ... linking ... done. Ошибка сегментирования В более новых системах работает без проблем. В Centos 5 x64 тоже работает. Более того, я тут обнаружил что раньше оно и в Centos 5 i686 работало, пока не начал использовать ghc-7.4.2. Какую точно версию использовал до этого не помню, вроде последние версии 6.Первым делом конечно попробовал сделать всё то же самое на си. Вот так: http://pastebin.com/ETWT6ZNcРаботает. Значит проблема где-то на нашей стороне.Путём нехитрого отладочного вывода нашёл место, где происходит сбой, это c_pam_authenticate.Отсюда вопрос: что делать и кто виноват куда копать дальше?Естественно, среди всего этого marshalling, malloc и free высока вероятность ошибки работы с памятью. Типизация здесь помогает слабо. Отсюда более общий вопрос: как отлаживать такой код и что можно сделать для упрощения поиска ошибок? Вот я перечитал весь код, вроде всё что нужно выделяется и освобождается, вроде сигнатуры все правильные. Как проверить наверняка? После уютненького хаскельного мира, точки взаимодействия с си кажутся очень ненадёжными.Upd: Если кто-то захочет помочь очень сильно, на что я особо не расчитываю, могу дать ssh доступ на ту машину.Upd: Немного локализовал проблему, сбой происходит в момент вызова моего хаскельного колбэка из кода сишной разделяемой библиотеки (libpam/pam_vprompt.c строка 83).
link 20 comments|post comment
Встреча MskHUG. [Nov. 30th, 2012|03:23 pm]Лямбда - функциональное программирование
[**Tags**|haskell, mskhug, встречи]В четверг, 13-го декабря, в 20:00, в конференц-центре на Филипповском можно будет собраться и обсудить Haskell и близко лежащие темы.Зал на 80 человек. Планируется проектор с экраном, доска-тетрадка и чай-кофе с легкими закусками. Я принесу бумаги и карандашей.Я смогу рассказать, как писать быстрые программы и постараюсь уложиться в разумное время наподобие получаса.Если не сложно, напишите мне на sergueyz на gmail.com свои ФИО, если собираетесь придти.PSАлексей Махоткин обещает принести на продажу книжек - переводов TAPL. 1000р/штука.
link 6 comments|post comment
Стиль написания. [Nov. 8th, 2012|02:28 pm]Лямбда - функциональное программирование
[**Tags**|haskell, чайник]Реализовал довльно простой алгоритм поиска дубликатов в больших массивах тектов.В двух словах, - абзац считается уникальным если нет другого такого хеша, котрый вычисляется как хеш суммы двух длиннейших предложений абзаца.Теперь вопрос - как этот алгоритм лучше всего записвать - https://gist.github.com/4031622Меня чисто эстетически настораживает такая запись:buildHashes txt = map (crc32.encode.concat.(take 2).sortSent.splitSent) (splitPar txt)Как бы вы это записали?
link 3 comments|post comment
attoparsec и передача состояния. [Dec. 29th, 2011|04:23 pm]Лямбда - функциональное программирование
[**Tags**|attoparsec, haskell]Всем доброго дня.Возник вот такой (вероятнее всего тупой) вопрос. Собрался я написать парсер одного бинарного формата. Выбор либы пал на attoparsec, который вроде бы для этого как раз и предназначен. Непонятно вот что. Как передать состояние внутрь парсера? Например в процессе парсинга находится какое-либо значение, которое потом нужно использовать чтобы разобрать следующий кусок данных (в другом парсере разумеется).
link 8 comments|post comment
Работа программистом-контрактором. [Dec. 16th, 2011|12:39 pm]Лямбда - функциональное программирование
[**Tags**|haskell, вакансии, работа]Стартап под названием Parallel Scientific ищет опытных программистов-контрактников для работы над высокопроизводительными вычислениями (high performance computing).Я узнал о них из Haskell-Cafe, где их рекомендовал сам SPJ. Кстати, руководители стартапа и Саймон довольно плотно общаются, насколько я понял.Хорошее знание Хаскеля обязательно. Основная задача - создание библиотек и оптимизаций компилятора (работа одного из первых участников компании) для ускорения работы научных и коммерческих вычислений на многопроцессорных машинах и кластерах.Я подчеркну, что Parallel Scientific уже имеет достаточный объём инвестиций (ранний этап, но уже инвестирован - early stages but funded). Это означает, что заработная плата будет весьма достойной - на уровне оплаты труда хороших программистов в США, но при возможности удалённой работы.Если всё это заинтересовало, то ваше резюме ждут на jobs@parsci.com.
link 6 comments|post comment
Монадные трансформеры [Sep. 26th, 2011|09:30 am]Лямбда - функциональное программирование
[**Tags**|haskell, hoopl]Допустим, у нас есть собственная монада, составленная как-то так:data CompileState = CompileState { cdict :: Dict, centry :: Maybe KId, ctmpid :: Int } deriving (Show) newtype CompileM a = CompileM { runT :: StateT CompileState (ErrorT CompileError IO) a } deriving (Monad, MonadIO, MonadError CompileError, MonadState CompileState) runCompile :: CompileState -> CompileM a -> IO (Either CompileError (a, CompileState)) и есть какой-то совершенно посторонний тип:type M = CheckingFuelMonad (SimpleUniqueMonad) runM :: M a -> a runM m = runSimpleUniqueMonad $ runWithFuel 0 m До некоторого момента, я запускал вычисления типа M по отдельности: runCompile $ do a <- runM $ ... b <- runM $ ... и в общем, то, что M и CompileM никак не связаны особых неудобств не доставляло. К сожалению SimpleUniqueMonad отвечает за генерацию меток, и так получилось, что теперь нужно сделать сквозную генерацию этих меток, т.е. как-то вытащить SimpleUniqueMonad на внешний уровень: runCompile $ do runM $ do a <- f1 :: CompileM ??? b <- f2 :: CompileM ??? c <- f3 a :: M x ??? Допустим, можно попытаться добавить M в стек монад CompileM, но что для этого нужно сделать?Написать собственный трансформер для типа M?Можно ли это сделать, не вдаваясь в реализацию CheckingFuelMonad / SimpleUniqueMonad ?Возможно ли добиться желаемого (запустить все вычисления в SimpleUniqueMonad ) как-то проще?
link 28 comments|post comment
Control.Monad.Writer [Sep. 22nd, 2011|09:01 am]Лямбда - функциональное программирование
[**Tags**|haskell]Насколько хорошая идея использовать Control.Monad.Writer, если то, что я вывожу во Writer является,скажем так, существенной частью вычисления? например, распределение регистров протаскивается по вычислению явно из блока в блок, а сами инструкции байткода пишутся при помощи tell ? Или лучше такого не делать?Например: ... (r, code) <- runWriterT $ do flip runReaderT (trEnvInit dict live p) $ do mapM trBlock blocks trace ("\n\n\n" ++ (intercalate "\n" $ code) ++ "\n\n\n" ) $ trace (intercalate "\n" $ concat r ) $ error "woops" where trEnvInit d l p = TREnv d l p trBlock b = foldBlockNodesF trNode b (return []) trNode :: forall e x . Insn e x -> TrM [String] -> TrM [String] trNode x r = tell [show x] >> liftM2 (++) r (return [show x]) ... печатает совсем не то, что ожидалось ( https://gist.github.com/1c409fcaa99ab32a34e5 ) . Хотелось бы использовать именно Writer для упрощения кода, но, видимо, я что-то не понимаю.
link 3 comments|post comment
navigation
[ viewing | most recent entries ] [ go earlier ]