@haskellru

Страница 361 из 1551
Mansur
22.08.2017
18:45:06
вызывается функция :: String -> String -> Bool, а записана :: (a,a) -> Bool

Ilya
22.08.2017
18:45:15
$ cat foo.hs authenticate ("Santa Claus", "Ho Ho Ho!") = True authenticate (_, _) = False

$ ghci foo.hs GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help [1 of 1] Compiling Main ( foo.hs, interpreted ) Ok, modules loaded: Main. λ> authenticate ("Santa Claus", "Ho Ho Ho!") True λ> authenticate ("1", "2") False λ>

проверяй

Google
Ilya
22.08.2017
18:45:28
че ты не так делаешь

как всё заработает - выкидывай кортеж и пробуй без него, он тут не нужен

Alexander
22.08.2017
18:48:48
напиши какой тип должен быть у authentificate

Ivan
22.08.2017
18:49:40
чувствую себя дауном , убрад ()

/tmp/haskell117722-14-f2fnzm.cdl2ivygb9/SleighAuthentication.hs:3:27: parse error on input `,'

теперь такое критует

Mansur
22.08.2017
18:50:20
запятую тоже нужно убрать

Alexander
22.08.2017
18:50:36
не нужно играть в обезьянку за печатной машинкой

и убирать и добавлять случайные синтаксические элементы

Ilya
22.08.2017
18:50:53
да, в хаскелле функции применяются как f a b

Alexander
22.08.2017
18:50:57
так только perl-лу научиться можно

Ivan
22.08.2017
18:51:00
да да ты прав

Alexander
22.08.2017
18:51:02
и то не факт

Google
Ivan
22.08.2017
18:51:08
пошел я учить

окей

Alexander
22.08.2017
18:51:46
как записывается определение функции от нескольких элементов же знаешь?

@Masteroid маловероятно, это ж не перл где любой случайный набор символов это валидная программа ?

Ivan
22.08.2017
18:52:52
authenticate :: String -> String -> Bool authenticate "Santa Claus" "Ho Ho Ho!" = True authenticate _ _ = False

понял свои ошибки

зашло

Alexander
22.08.2017
18:53:00
\o/

Ivan
22.08.2017
18:53:00
уроя

уря

)))

Yuriy
22.08.2017
21:16:26
первый уровень пройден

всего в этой игре 3 уровня

1. написать программу

2. написать свою программу

3. выбрать свой путь

Index
22.08.2017
21:18:24
Рано или поздно я до (1) доберусь

Пока что только библиотеки выходят, а программы не особо.

Arseniy
22.08.2017
21:32:29
Скоро выйдет ;)

Google
Alexander
22.08.2017
21:34:31
поздравляю с релизом красивого сайта пока :)

? animufag ?
22.08.2017
22:11:30
просто поделюсь: vscode + haskero очень даже неплох. правда мне поначалу казалось что там автодополнение по типу, но видимо просто везло. и ещё вот такую табличку нашёл https://github.com/rainbyte/haskell-ide-chart

поидее кейворды в лексере и всякие комы с семиколонами должны иметь тип Parser () в отличие от идентифиеров, имя которых должно дальше пригодится но в документации и гайдах они Parser String. Даже в диагностике ошибок этот стринг вроде не нужен или я что-то упускаю?

Yuriy
23.08.2017
06:14:53
Пока что только библиотеки выходят, а программы не особо.
библиотека — тоже программа, в широком смысле

@vlastachu, ты всегда можешь игнорировать String

а наоборот, возможно, кому-нибудь тоже будет надо когда-нибудь

например, различать каждую из сотни юникодных запятых

Yuriy
23.08.2017
11:27:19
а чего ж не <$>?
например, потому что в классе Functor написано именно fmap

Alex
23.08.2017
11:36:48
а чего ж не <$>?
Тогда бы джаваскриптеры бы взвыли

Denis
23.08.2017
12:00:39
вообще там do не нужен

можно и просто fmap

Ilya
23.08.2017
12:01:45
жаваскриптеры негодуют https://twitter.com/jaredforsyth/status/900023624073084929
Если уж отказываться от временных имён, чтобы "looks prettier", то я бы написал так main = do putStrLn =<< intersperse '-' . reverse . map toUpper <$> getLine

Denis
23.08.2017
12:01:48
putStrLn <$> (fmap fn getLine)

Ilya
23.08.2017
12:01:57
Да, без do

Alexander
23.08.2017
12:04:08
putStrLn =<< fmap fn getLine тогда уж

а то получается IO (IO ())

Vasiliy
23.08.2017
12:07:18
да тут и fmap не нужен putStrLn . fn =<< getLine

kana
23.08.2017
12:08:27
Часто кто использует =<<?

Alexander
23.08.2017
12:19:55
часто не знаю, иногда использую

Google
That Guy
23.08.2017
20:10:53
Товарищи, подскажите, существуют ли инструменты для автоматического преобразования формул, чтобы они считались более стабильно, наподобие https://github.com/mikeizbicki/HerbiePlugin, но не в виде плагина к GHC, а как отдельный инструмент? Грубо говоря, у меня есть формула, я хочу её куда-нибудь запихать и получить эквивалентную формулу, но которая будет считаться стабильно.

Мб что-то такое есть в Mathematica, Maple или в качестве малоизвестного плагина к Sympy?

Denis
23.08.2017
21:06:28
какая-то балерина https://ballerinalang.org/

? animufag ?
23.08.2017
21:21:25
Чёт выглядит слабеньео

Для бьютифул Ну может вытеснить го

Misha
23.08.2017
22:32:31
а есть какие-нибудь идиоматические способы делать вот татую штуку без тайпклассов: f :: X x -> R x f = f1 если x == x1 f = f2 если x == x2 where f1 :: X x1 -> R x1 f2 :: X x2 -> R x2 можно и тайпклассом, но как-то совершенно не хочется их сюда тянуть, будет абсолютно искусственно. Есть какие-нибудь современнеы способы решить между f1 и f2 type level, что-нибудь по типу boost в С++, простигоспади Я нашел какие-то https://hackage.haskell.org/package/type-level-0.3.0 но совершенно не уверен, что это оно

kana
23.08.2017
22:41:08
Какие-нибудь семейства типов, не уверен. Как с функцией связать хз конечно. Не, тайпфэмили тут не при чем

Index
23.08.2017
22:43:36
А X это что, type family?

Misha
23.08.2017
22:44:06
Index
23.08.2017
22:45:37
Так вот, надо понимать, что в рантайме в таком случае матчить не на что. Будет у тебя, например, X A = Int, а X B = Bool, вот и придет в твою функцию один указатель, а по нему попробуй пойми что — Int или Bool (не говоря уже о невозможности определить, было это A или B, потому что type families не инъективные)

Решается это тем, чтобы добавить GADT и передавать его

data SX x where SX_A :: SX A SX_B :: SX B f :: SX x -> X x -> R x

А там уж можно на SX матчиться и творить что душе угодно в разных ветках кейса

Misha
23.08.2017
22:46:46
ну вот я как раз ничего в рантайме не хочу матчить вообще

там динамически вообще нечего решать

Index
23.08.2017
22:47:16
Если ты не хочешь матчить ничего в рантайме, то вызывай f1 или f2 статически и проблема решена, нет?

Misha
23.08.2017
22:48:29
конечно, но мне хочется идиому типа "если параметр типа такой, то вызывать f1, иначе f2"

Index
23.08.2017
22:49:13
Ну ладно, тогда давай по порядку разбирать X A = Int X B = Int вызвали, передав Int. Будет f1 для A или f2 для B?

А если гарантированно разное, то начать надо с того, чтобы сделать эту type family инъективной (или заменить на data family)

Misha
23.08.2017
22:51:30
у меня есть вот такое data ErrorCaching = NoErrorCaching | TimedCaching NominalDiffTime type family IOResult_ v (caching :: ErrorCaching) type instance IOResult_ v NoErrorCaching = Either SomeException v type instance IOResult_ v (TimedCaching _) = Either (SomeException, UTCTime) v

Google
Misha
23.08.2017
22:51:53
и надо имплементировать немного разные вещи в зависимости от ErrorCaching

то есть это можно переделать на data family наверное

Index
23.08.2017
22:52:57
Теперь второй пункт, про статический выбор f1 или f2. Делать это в compile-time гарантированно невозможно, но если сделать класс, то со включенными оптимизациями скорее всего сработает инлайнинг/специализация. При условии, что f не рекурсивная

Misha
23.08.2017
22:53:23
круто

а почему невозможно?

Index
23.08.2017
22:54:35
Потому что создав функцию с типом X x -> R x ты даешь возможность вызывающему определить x в рантайме.

А если твое рассуждение полагается на то, что никто этого делать просто не станет, то это уже оптимизация, а на них полагаться 100% нельзя.

Misha
23.08.2017
22:55:16
опа, а вот это интересно

класс я конечно могу сделать, но сейчас в коде (для динамической реализации) есть вещи типа case errorCaching of NoErrorCaching -> blabla TimedCaching _ -> blabla2 и они раскиданы в разных местах, так что делать из этого класс ну как-то совсем стремно

но либо так либо GADT, получается

Index
23.08.2017
22:56:26
Ну если ты делаешь case errorCaching of, то это все равно рантайм-диспатчеризация

Misha
23.08.2017
22:56:49
да, и вот я от нее хочу избавиться, потому что реально динамики там не будет никогда

это compile-type параметр по сути

Index
23.08.2017
22:57:57
Если это полностью статический параметр и ты не делаешь по нему индукции, то тогда похоже на юзкейс для Backpack

Misha
23.08.2017
22:58:11
охЪ

тогда уж GADT

Потому что создав функцию с типом X x -> R x ты даешь возможность вызывающему определить x в рантайме.
спасибо, у меня только вопрос остался, как так x может определяться в рантайме?

Index
23.08.2017
23:04:11
Если экзистенциальную переменную распаковать. data SomeSX = forall x. SomeSX (SX x) main = do s <- getLine SomeSX (_ :: SX x) <- return $ if s == "hello" then SomeSX SX_A else SomeSX SX_B -- here 'x' is a type variable that -- was determined at runtime -- by whether the user has -- entered "hello" or something else

Страница 361 из 1551