
Kelin
01.12.2017
12:11:12
Ну jsx лично мне не особо нравится
Но это куда лучше mol

kana
01.12.2017
13:35:11
Так, я раньше немного неверно понимал суть призм
Я думал, что призмы - это все такие линзы, которые возвращают Maybe
и не понимал поэтому, почему at - линза, а не призма

Google

kana
01.12.2017
13:36:22
напомню - at получает ключ и достает maybe значение из мапа (или записывает)

Aleh
01.12.2017
13:37:32

? animufag ?
01.12.2017
13:38:09
наверное ща не ссылка будет
пост на канале

Aleh
01.12.2017
13:38:45
ну не суть


kana
01.12.2017
13:39:23
короче, правильная интуиция должна быть такой - линзы - разбор произведения типов (таплы, рекорды), а призмы - разбор суммы типов (то есть выбор по тегу/конструктору)
Поэтому at - не призма, так как ключи мапы - не теги. НО! Использовать at зачастую нужно с призмой _Just (тег maybe)
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Data.HashMap.Lazy (HashMap)
import qualified Data.HashMap.Lazy as HashMap
import Control.Monad.Reader
import Lens.Micro.Platform
type UserId = Int
data User = User
{ _userId :: UserId
, _userName :: String
}
data Env = Env
{ _users :: HashMap UserId User
}
makeLenses ''User
makeLenses ''Env
getUserNameById :: UserId -> Reader Env (Maybe String)
getUserNameById userId' = do
users' <- view users
pure $ do
user <- HashMap.lookup userId' users'
pure $ user^.userName
getUserNameById' :: UserId -> Reader Env (Maybe String)
getUserNameById' userId' = preview $ users.at userId'._Just.userName
main :: IO ()
main = do
print $ runReader (getUserNameById 1) env -- Just “first”
print $ runReader (getUserNameById' 2) env -- Just “second”
print $ runReader (getUserNameById 3) env -- Nothing
print $ runReader (getUserNameById' 4) env -- Nothing
where
env = Env $
HashMap.fromList
[ (1, User 1 "first")
, (2, User 2 "second")
]
не, ссылки нет, это мысли, пришедшие во время написания кода


Hitomi's
01.12.2017
14:44:56
var getFromStorage = function(key) {
return function() {
return localStorage[key];
};
};
Почему эта функция считается чистой ?
А если я напишу так, то нет
var getFromStorage = function(key) {
return localStorage[key];
};

Cenator
01.12.2017
14:45:20
они обе не чистые

kana
01.12.2017
14:45:43
+

Hitomi's
01.12.2017
14:45:46
https://drboolean.gitbooks.io/mostly-adequate-guide/content/ch8.html#old-mcdonald-had-effects
вот
гляньте

Google

Hitomi's
01.12.2017
14:45:52
пилз
плиз*
там ниже он пишет, что она чистая
This function contained a side-effect, but we dubbed it pure by wrapping its action in another function.
Понятно, что она имеет сайд-эффект
Ну вот он говорит, что он так типо чище стала

andretshurotshka?❄️кде
01.12.2017
14:47:59
это как с fork

kana
01.12.2017
14:48:07
а, лол, не заметил
да, первая - чистая
потому что сайд-эффектов она не делает

Hitomi's
01.12.2017
14:48:24
ааа

kana
01.12.2017
14:48:31
она возвращает санк, который уже делает сайд-эффект, если его форкнуть (вызвать)

Hitomi's
01.12.2017
14:48:46
а что он нам дает
?
можно на каком-нить простом примерчеке?

kana
01.12.2017
16:05:17
так, народ
я понял, что нужно человечеству
монады в явном виде не нужны

andretshurotshka?❄️кде
01.12.2017
16:06:24
че нужно
призмы?

Google

kana
01.12.2017
16:06:30
императивность)

andretshurotshka?❄️кде
01.12.2017
16:06:33
ого

kana
01.12.2017
16:06:39
НО!

Дмитрий
01.12.2017
16:06:52
Очевидно, это слишком высокая абстракция
Но я не уверен, что это реально можно обойти

andretshurotshka?❄️кде
01.12.2017
16:07:51

adam
01.12.2017
16:08:29

Nikita
01.12.2017
16:08:52
С:

adam
01.12.2017
16:09:31
зачем еще монады, если есть Cont

Дмитрий
01.12.2017
16:10:26
Тамбара то на кой черт

Дмитрий
01.12.2017
16:10:44
Вот уж что что а это точно детали реализации

kana
01.12.2017
16:11:03
если взять продакшеновый хаскель код, можно увидеть, что он императивный. Да, программы на хаскеле императивные, монады и do-нотация дают нам возможность писать императивный код. Отличие от других императивных языков только в том, что у нас императивный код с контролируемыми эффектами. Кто-то может возразить, что внутри-то там все функционально, но тут важно вспомнить, что то, что выглядит как A и ведет себя как A, A и является, иначе и хаскель - не ФПЯ, ведь в императивные опкоды компилируется.
Вот это миру и нужно. Нужен императивный язык с явным контролем эффектов и чтобы не вникать в монады и монадные трансформеры
Раст пока не такой, но имхо дует там примерно из правильной стороны

adam
01.12.2017
16:12:26
> Описывает привычки своей стилистики написания кода как аксиоматичные

kana
01.12.2017
16:13:04
да, этот момент я тоже учитываю, нужно думать о том, как решать бизнес-задачи не императивно
пока что я таких вариантов не видел)

adam
01.12.2017
16:13:52

kana
01.12.2017
16:13:55
Кстати, получается, что мы пишем импераивные программы на хаскеле, которые потом трансформируются в функциональные, которые потом компилируется в императивные команды

Google

andretshurotshka?❄️кде
01.12.2017
16:14:59
пили DSL на free
хотя это тож наверно императивно

kana
01.12.2017
16:15:45
ну так да

Denis
01.12.2017
16:17:40

? animufag ?
01.12.2017
16:17:47
если взять продакшеновый хаскель код, можно увидеть, что он императивный. Да, программы на хаскеле императивные, монады и do-нотация дают нам возможность писать императивный код. Отличие от других императивных языков только в том, что у нас императивный код с контролируемыми эффектами. Кто-то может возразить, что внутри-то там все функционально, но тут важно вспомнить, что то, что выглядит как A и ведет себя как A, A и является, иначе и хаскель - не ФПЯ, ведь в императивные опкоды компилируется.
Вот это миру и нужно. Нужен императивный язык с явным контролем эффектов и чтобы не вникать в монады и монадные трансформеры
Так монады = без костылей выразить наличие эффектов в типе

Дмитрий
01.12.2017
16:18:45
Я кажется решил все проблемы мешающие их описывать в жс и можно делать типизированную имплементацию)

Admin
ERROR: S client not available

kana
01.12.2017
16:20:28
да, я не спорю, я не говорю, что монады не нужны. Мало того, монады позволяют нам связывать команды в последовательность, что и дает нам писать императив (а с do-нотацией это и выглядит имеративно) с контролем эффектов. Просто программисту не нужно об этом знать, ему просто нужен императивный язык, но где будет контроль эффектов
фри не про то, DSL на фри лишь позволит убрать вообще все эффекты и вынести их в интерпретатор, код же все равно будет императивный)

andretshurotshka?❄️кде
01.12.2017
16:21:52
оно в жс умеет компилиться?
Idris> 200 - 100
(input):1:5-6:When checking argument smaller to function Prelude.Nat.-:
Can't find a value of type
LTE 100 200

illiatshurotshka❄️
01.12.2017
17:46:27
а как там называлась книга по хаскелю которая основана на проектах?
вроде @xgrommx говорил про нее
а
Beginning Haskell: A Project-Based Approach, 2014

andretshurotshka?❄️кде
01.12.2017
18:01:36
pdf есть?

illiatshurotshka❄️
01.12.2017
18:03:36
ща посмотрю

Google

Denis
01.12.2017
18:48:36
кто решил 1 день от aoc?

Hitomi's
01.12.2017
21:24:19
Как мне ответили выше, это функция чиста, потому что отложенный запуск. Окей - это понятно, но автор пишет, что мол если бы не было этой обертки (в первой функции), то аутпут у нас мог бы быть разным. Что это за херня? Как он может быть разным, если инпут мы кидаем вручную
var getFromStorage = function(key) {
return function() {
return localStorage[key];
};
};
Почему эта функция считается чистой ?
А если я напишу так, то нет
var getFromStorage = function(key) {
return localStorage[key];
};
var getFromStorage = function(key) {
return function() {
return localStorage[key];
};
}; - я ща эту функцию
за*

Cenator
01.12.2017
21:25:43

kana
01.12.2017
21:25:45
ну так localStorage разный может быть
localStorage.a = 1
getFromStorage(“a”) // 1
localStorage.a = 2
getFromStorage(“a”) // 2
передаем одни и те же аргументы, а результаты разные
а с оберткой результат будет всегда один и тот же - функция

Kelin
01.12.2017
21:27:11
на самом деле это довольно рофляный момент

Hitomi's
01.12.2017
21:27:19
хм... так, ща подумая

Kelin
01.12.2017
21:27:20
грязную функцию завернуть еще в одну и это будет чистая

kana
01.12.2017
21:27:24

Kelin
01.12.2017
21:27:40
но все равно, это утаивание правды))

Дмитрий
01.12.2017
21:27:44

kana
01.12.2017
21:27:44
нет

Kelin
01.12.2017
21:27:54