
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
пошел я учить
окей

Ilya
22.08.2017
18:51:35

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
а наоборот, возможно, кому-нибудь тоже будет надо когда-нибудь
например, различать каждую из сотни юникодных запятых

Vladimir
23.08.2017
10:53:22

Yuriy
23.08.2017
11:27:19

Alex
23.08.2017
11:36:48

Denis
23.08.2017
12:00:39
вообще там do не нужен
можно и просто fmap

Ilya
23.08.2017
12:01:45

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

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