deniok: (ухмыляюсь)
[personal profile] deniok
А вот скажите, пожалуйста, та идея что присваивание полю структуры может менять не только значение, но и тип структуры, она помимо кметтовских линз где-нибудь еще в статически типизированных языках реализована?
> ('z', True) & _1 .~ 42
(42, True)


UPD. Мне тут делают совершенно резонное замечание, что стандартный синтаксис модификации записей в Хаскеле обладает этим свойством:
> data Pair a b = Pair {fstP :: a, sndP :: b} deriving Show
> let p1 = Pair True 'z'
> :t p1
p1 :: Pair Bool Char
> let p2 = p1 {fstP = 42}
> :t p2
p2 :: Num a => Pair a Char
У меня это совершенно вылетело из головы.

Date: 2016-01-27 04:34 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Хм, хорошая идейка-то.

Date: 2016-01-27 05:49 pm (UTC)
From: [identity profile] zelych.livejournal.com
ээ.. может в хаскеле?
> data X a = X {a :: a, b :: Int} deriving Show
> let x = X 10 12
> :t x
x :: Num a => X a
> let y = x {a = "adf"}
> :t y
y :: X [Char]


Date: 2016-01-27 07:34 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Да, это очень верное, полезное и уместное замечание.

Date: 2016-01-27 08:04 pm (UTC)
From: [identity profile] voidex.livejournal.com
Ну, всё-таки, это не кметтовские линзы же :)

Date: 2016-01-27 08:15 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
ok, напишу апдейт.

Date: 2016-01-27 09:24 pm (UTC)
From: [identity profile] max630.livejournal.com
> стандартный синтаксис модификации записей в Хаскеле обладает этим свойством

в ocaml то же самое:

# type 'a foo = { bar : 'a; baz : int };;
type 'a foo = { bar : 'a; baz : int; }
# let a = { bar = "hello"; baz = 1 };;
val a : string foo = {bar = "hello"; baz = 1}
# { a with bar = 1 } ;;
- : int foo = {bar = 1; baz = 1}

Date: 2016-01-28 01:51 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
А F# или Scala как, не знаете?

Date: 2016-01-28 02:00 pm (UTC)
From: [identity profile] max630.livejournal.com
в scala case class делал то же самое. Примерно так (скальные конструкции нагуглены и сразу же забыты, пишу что помню):

> case class Foo[T](Bar:T,Baz:Int)
> var a = Foo(123,456)
a: Foo[Int]
> a.copy(Bar="789")
-: Foo[String]

С F# мне лень гуглить, да и пробовать негде дома.

Date: 2016-01-28 05:00 pm (UTC)
From: [identity profile] migmit.livejournal.com
Строго говоря, copy — это просто автосгенерённый метод с дефолтными аргументами:
def copy[S](Bar: S = Bar, Baz: Int = Baz) = Foo(Bar, Baz)
а не особая синтаксическая конструкция.

Date: 2016-01-28 02:01 pm (UTC)
From: [identity profile] nealar.livejournal.com
В скалке динамическая типизация же! Мутабельность + наследование.

Date: 2016-01-28 05:01 pm (UTC)
From: [identity profile] migmit.livejournal.com
А вот это грубо. Сабтайпинг — это ещё не динамическая типизация.

Date: 2016-01-29 08:36 am (UTC)
From: [identity profile] nealar.livejournal.com
На практике ощущается именно так.
Вот буквально на днях передали в функцию Seq(Seq(OurCoolType)) вместо Seq(OurCoolType), оно привелось к Any и скомпилировалось! Ловили в рантайме.

Или, полгода назад, опечатавшись, отправили актёру classOf вместо самого значения. Опять же, компилятор вывел общий тип и схавал.

Как будто как в детстве на JS пишешь.

Date: 2016-01-29 08:40 am (UTC)
From: [identity profile] migmit.livejournal.com
Откуда вы только взяли этот classOf...

А вообще подобные штуки даже в Хаскеле встречаются. Нет, я не спорю, что система с сабтайпингом слабее системы без него. Но всё же она на светлой стороне Силы.

Вы, наверное, даже на JS писали, как будто он статически типизированный.

Date: 2016-01-29 01:03 pm (UTC)
From: [identity profile] nealar.livejournal.com
Скобки поставить забыли.

Date: 2016-01-29 01:15 pm (UTC)
From: [identity profile] migmit.livejournal.com
А, объект-компаньон. Так бы и сказали.

Date: 2016-01-29 06:15 pm (UTC)
From: [identity profile] nealar.livejournal.com
Я уже не помню.

Date: 2016-01-28 05:38 am (UTC)
From: [identity profile] geniepro.livejournal.com
Но ведь в хаскельном примере нет присваивания полю существующей структуры нового значения -- лишь создание новой структуры на основе имеющейся...

Date: 2016-01-28 10:11 am (UTC)
From: [identity profile] deni-ok.livejournal.com
"Имеющейся" в каком смысле? Хаскель же ленивый и имеет механизм разделения через thunk'и:
> let x = 6 * 7 :: Int
> let p3 = Pair True x
> :sprint p3
p3 = Pair True _
> let p4 = p3 {fstP = x}
> :sprint p4
p4 = _
> sndP p4
42
> :sprint p4
p4 = Pair 42 42
> :sprint p3
p3 = Pair True 42

Profile

deniok: (Default)
deniok

April 2017

S M T W T F S
      1
23 45678
9101112131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 25th, 2017 02:52 pm
Powered by Dreamwidth Studios