Size: a a a

PureScript — русскоговорящее сообщество

2018 July 28

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Причина для вопроса — хочется сделать паттерн-матчинг для рекорда и одновременно указать типы:

let 
  rec :: { foo :: String, bar :: Int }
  rec@{ foo, bar } = ...

получается, что обязательно надо добавить имя, даже если оно мне не нужно в дальнейшем коде. Или я что-то не так делаю?
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
А нет, даже так не работает
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
Указать типы прямо в матчинге нельзя?
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
и вообще
let
 (smth :: Type) = otherFunc
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
Так можно в хаскеле, думаю и в пурсе можно
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
Проверил. Такое работает:

type R = { foo :: String, bar :: Int }

a :: R
a = { foo: "Foo", bar: 42 }

main :: Eff (dom :: DOM) Unit
main =
 let (rec@{foo} :: R) = a
 in render $ p $ text foo
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
Вообще

let
 x :: T
 x = y


это сахар для

let
 (x :: T) = y


Поэтому очевидно, что и с рекордами такое прокатит
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
Хмм. А в пурсе нет сечений для операторов, потому что _ можно?
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Aleksei (astynax) Pirogov
Проверил. Такое работает:

type R = { foo :: String, bar :: Int }

a :: R
a = { foo: "Foo", bar: 42 }

main :: Eff (dom :: DOM) Unit
main =
 let (rec@{foo} :: R) = a
 in render $ p $ text foo
Круто, спасибо большое! Не подумал про скобки
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
Местные аннотации типов почти всегда скобок требуют. И такие аннотации можно делать почти везде
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
Т.о. let x = (y :: T) ~ let (x :: T) = y и можно брать тот вариант, который удобнее
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
Да и вообще для тех же дырок удобно
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
very long (expression (with many (function calls and (args :: _) can) be hard to reason about))
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
Берём нужное подвыражение, обосабливаем с помощью скобок и "типизируем" дыркой. Компилер нам скажет, что за тип там выведется
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
воу, клёвый трюк
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
отлично вообще
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
ага
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
ещё есть именованные дырки (Typed holes):
1 + ?hole + 2
тоже полезные, как и Type Wildcards (_)
источник

AP

Aleksei (astynax) Pirogov in PureScript — русскоговорящее сообщество
Разница в том, что скажет компилер. Для type wildcard будет дан тип подвыражения. Для typed hole - ожидаемый надвыражением тип на месте дырки
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
эти использую, да, но в сложных случаях всё равно боль пока что, когда монада в монаде и компилятор такой:

Could not match type Eff with type Maybe, меняешь код, Could not match type Maybe with Eff
источник