Size: a a a

2021 March 22

YS

Yan Shkurinskiy in Haskell Start
Что хочется выразить такой сигнатурой?
источник

E

Elijah in Haskell Start
верно
источник

E

Elijah in Haskell Start
сейчас
источник

E

Elijah in Haskell Start
в книжке используется пример с роботами, где для имитации ООП используются замыкания
источник

E

Elijah in Haskell Start
robot (name, attack, hp) = \message -> message (name, attack, hp)
источник

E

Elijah in Haskell Start
я выразил тип таким образом:
robot :: (String, Int, Int) -> ((String, Int, Int) -> a) -> a
источник

E

Elijah in Haskell Start
но мне подумалось, что было бы хорошо вот эту часть ((String, Int, Int) -> a) -> a оформить в виде синонима
источник

YS

Yan Shkurinskiy in Haskell Start
тут это не выйдет, кажется
источник

IK

Ilya Kos in Haskell Start
Можно сделать Robot a
источник

IK

Ilya Kos in Haskell Start
Без дополнительных расширений красивее не получится
источник

YS

Yan Shkurinskiy in Haskell Start
Так как хочется - будет полиморфизм второго порядка
источник

YS

Yan Shkurinskiy in Haskell Start
А это не то, что хочется
источник

E

Elijah in Haskell Start
меня сильно смущает, то что книгой подразумевается, что я решу задачу зная о типах еще меньше чем знаю сейчас
источник

YS

Yan Shkurinskiy in Haskell Start
robot :: forall a . (String, Int, Int) -> ((String, Int, Int) -> a) -> a

вот так оно выглядит, если явно forall сделать
источник

JS

Jerzy Syrowiecki in Haskell Start
о, это прекрасная книжка. красивый пример, но когда начинаешь сигнатуры писать, черти вылезают
источник

E

Elijah in Haskell Start
setName aRobot newName = aRobot (\(_, a, h) -> robot (newName, a, h))
источник

E

Elijah in Haskell Start
вот тут начинаются черти
источник

JS

Jerzy Syrowiecki in Haskell Start
да, там RankNTypes придётся включать
источник

YS

Yan Shkurinskiy in Haskell Start
можно сделать алиас для (String, Int, Int)
источник

YS

Yan Shkurinskiy in Haskell Start
Уже будет не так страшно
источник