Присваивание

Jan 27, 2016 19:20

А вот скажите, пожалуйста, та идея что присваивание полю структуры может менять не только значение, но и тип структуры, она помимо кметтовских линз где-нибудь еще в статически типизированных языках реализована?

> ('z', True) & _1 .~ 42
(42, True)
UPD. Мне тут делают совершенно резонное замечание, что стандартный синтаксис модификации записей в ( Read more... )

lens, haskell

Leave a comment

Comments 18

ex_juan_gan January 27 2016, 16:34:10 UTC
Хм, хорошая идейка-то.

Reply


zelych January 27 2016, 17:49:54 UTC
ээ.. может в хаскеле?

> 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]

Reply

deni_ok January 27 2016, 19:34:16 UTC
Да, это очень верное, полезное и уместное замечание.

Reply

voidex January 27 2016, 20:04:45 UTC
Ну, всё-таки, это не кметтовские линзы же :)

Reply

deni_ok January 27 2016, 20:15:43 UTC
ok, напишу апдейт.

Reply


max630 January 27 2016, 21:24:11 UTC
> стандартный синтаксис модификации записей в Хаскеле обладает этим свойством

в 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}

Reply

deni_ok January 28 2016, 13:51:52 UTC
А F# или Scala как, не знаете?

Reply

max630 January 28 2016, 14:00:47 UTC
в 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# мне лень гуглить, да и пробовать негде дома.

Reply

migmit January 28 2016, 17:00:37 UTC
Строго говоря, copy - это просто автосгенерённый метод с дефолтными аргументами:
def copy[S](Bar: S = Bar, Baz: Int = Baz) = Foo(Bar, Baz)а не особая синтаксическая конструкция.

Reply


geniepro January 28 2016, 05:38:38 UTC
Но ведь в хаскельном примере нет присваивания полю существующей структуры нового значения -- лишь создание новой структуры на основе имеющейся...

Reply

deni_ok January 28 2016, 10:11:23 UTC
"Имеющейся" в каком смысле? Хаскель же ленивый и имеет механизм разделения через 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

Reply


Leave a comment

Up