Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / list comprehension в F# / 20 сообщений из 20, страница 1 из 1
15.04.2010, 15:02:04
    #36580761
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
есть такой синтаксический сахар, как замена do yield на -> .
Эти выражения эквивалентны:

Код: plaintext
1.
2.
let myList = [for i in  0 .. 3  do yield  0 . 5  * float i]
let myList = [for i in  0 .. 3  ->  0 . 5  * float i]

Но я был удивлен когда выражение
Код: plaintext
let s = [ for i =  1  to  3  -> i ]
не компилируется пока не заменишь на
Код: plaintext
let s = [ for i =  1  to  3  do yield i ]

"for .. in .. -> .." работает, а "for .. to .. -> .." - нет

Серьезной проблемы здесь нет. Просто возникли вопросы к тем кто использует f#:
Может это не единственный баг, а таких много?
Действительно ли Майкрософт будет продвигать этот язык?
Получается ли у вас органично сочетать функциональный стиль с дотнетовскими библиотеками, или нужно выработать новый, гибридный стиль программирования?(на это вопрос прошу ответить не только f#-еров, но и программистов занимающимися другими гибридными языками для платформ .net и java(nemerle, scala итд.)).
Исправлен ли это баг в новых редакциях(у меня vs2010beta2)?

p.s. Пол года назад на дотнетовском форуме я уже задавал вопрос по перспективности F#, но меня там встретили с шутками: "айтизагибаетсо", "не податься ли те в гитаристы" и тд. Сейчас я нашел время заняться этим языком, но уже после первых примеров найдя баги, был огорчен. Поэтому прошу уже без шуток обсудить данный язык.
...
Рейтинг: 0 / 0
15.04.2010, 16:17:35
    #36580895
belugin4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
в релизе тоже самое, но я бы не стал вот так называть это багой - для этого надо найти в language specification такое правило. Я думаю еще рано говорить о наличии багов в релизе F# так как он вышел в начале недели и данных по использованию, думаю, еще мало.

Сам использовал эпизодически багов не видел - было странное поведение VS при редактировании fsyaml файлов, но терпимое
...
Рейтинг: 0 / 0
15.04.2010, 16:30:31
    #36580925
belugin4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
см. грамматику: http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.pdf

-> это не слово заменяющее yield а часть спецсинтаксиса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
[ comp-or-range-expr] -- computed list expression
...
comp-or-range-expr :=
  comp-expr
  short-comp-expr
  range-expr

comp-expr :=
  let! pat = expr in comp-expr -- binding computation
  do! expr in comp-expr -- sequential computation
  use! pat = expr in comp-expr -- auto cleanup computation
  yield! expr -- yield computation
  yield expr -- yield result
  return! expr -- return computation
  return expr -- return result
  expr -- control flow or imperative action
-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
short-comp-expr :=
  for pat in expr-or-range-expr -> expr -- yield result
...
Рейтинг: 0 / 0
15.04.2010, 16:30:52
    #36580928
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
belugin4в релизе тоже самое, но я бы не стал вот так называть это багой - для этого надо найти в language specification такое правило. Я думаю еще рано говорить о наличии багов в релизе F# так как он вышел в начале недели и данных по использованию, думаю, еще мало.

Сам использовал эпизодически багов не видел - было странное поведение VS при редактировании fsyaml файлов, но терпимое

Programming F#
let allIntsSeq = seq { for i = 0 to System.Int32.MaxValue -> i }

пример с книги Programming F#, у меня не скомпилился.
Думаю, если автор писал так, то это не противоречит спецификации, хотя ...
...
Рейтинг: 0 / 0
15.04.2010, 16:34:54
    #36580938
belugin4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
В релизе оно дает вот такую ошибку
"Error 1 The use of '->' in sequence and computation expressions is limited to the form 'for pat in expr -> expr'. Use the syntax 'for ... in ... do ... yield...' to generate elements in more complex sequence expressions."

То есть это не бага, это фича!
...
Рейтинг: 0 / 0
15.04.2010, 16:35:18
    #36580941
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
belugin4см. грамматику: http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.pdf

-> это не слово заменяющее yield а часть спецсинтаксиса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
[ comp-or-range-expr] -- computed list expression
...
comp-or-range-expr :=
  comp-expr
  short-comp-expr
  range-expr

comp-expr :=
  let! pat = expr in comp-expr -- binding computation
  do! expr in comp-expr -- sequential computation
  use! pat = expr in comp-expr -- auto cleanup computation
  yield! expr -- yield computation
  yield expr -- yield result
  return! expr -- return computation
  return expr -- return result
  expr -- control flow or imperative action
-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
short-comp-expr :=
  for pat in expr-or-range-expr -> expr -- yield result

Programming f#
When using for loops within list comprehensions, you can simplify the code by using
-> instead of do yield. The following two code snippets are identical:
// Generate the first ten multiples of a number
let multiplesOf x = [ for i in 1 .. 10 do yield x * i ]
// Simplified list comprehension
let multiplesOf2 x = [ for i in 1 .. 10 -> x * i ]

ссылался на книгу. спецификацию не читал
...
Рейтинг: 0 / 0
15.04.2010, 16:38:30
    #36580948
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
belugin4В релизе оно дает вот такую ошибку
"Error 1 The use of '->' in sequence and computation expressions is limited to the form 'for pat in expr -> expr'. Use the syntax 'for ... in ... do ... yield...' to generate elements in more complex sequence expressions."

То есть это не бага, это фича!

мен студия выдала это:
[src]Error 1 Unexpected symbol '->' in expression. Expected 'do' or other token.[/SRC

в релизе видно изменили сообщение об обшыбке, вместо того чтобы пофиксить багу.
...
Рейтинг: 0 / 0
15.04.2010, 16:40:05
    #36580954
belugin4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
ZyK_BotaNДумаю, если автор писал так, то это не противоречит спецификации, хотя ...

В книгах бывают опечатки, язык F# менялся несколько раз. Фактически 2.0 - первый финальный релиз.

см например список изменений октябрьского ctp
...
Рейтинг: 0 / 0
15.04.2010, 16:43:00
    #36580962
belugin4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
ZyK_BotaN
в релизе видно изменили сообщение об обшыбке, вместо того чтобы пофиксить багу.

Если багой называть противоречие книжке, то можно так сказать :)
...
Рейтинг: 0 / 0
15.04.2010, 16:47:37
    #36580971
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
belugin4ZyK_BotaN
в релизе видно изменили сообщение об обшыбке, вместо того чтобы пофиксить багу.

Если багой называть противоречие книжке, то можно так сказать :)

это была шутка(но с ну удивлюсь, если с долей правды)
...
Рейтинг: 0 / 0
15.04.2010, 17:20:12
    #36581044
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
ZyK_BotaN,

в спецификации про list comprehensions ничего не нашел.
Если оно там есть, то, пожалуйста, ткните меня носом, на какой странице.
...
Рейтинг: 0 / 0
15.04.2010, 17:45:59
    #36581109
belugin4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
ZyK_BotaN,

Как видно из приведенного мной кусочка BNF оно называется там computed list expression. Короткая форма с -> - short-comp-expr
...
Рейтинг: 0 / 0
15.04.2010, 18:16:12
    #36581192
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
belugin4ZyK_BotaN,

Как видно из приведенного мной кусочка BNF оно называется там computed list expression. Короткая форма с -> - short-comp-expr

спасибо
...
Рейтинг: 0 / 0
15.04.2010, 18:43:08
    #36581246
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
Пока сам не увидел спецификацию - не верил.
Хорошо что в релизе более информативное сообщение об ошибке.
...
Рейтинг: 0 / 0
07.05.2010, 10:31:34
    #36616805
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
Решил протестировать лямбда исчисление на F#.

Код: plaintext
1.
2.
3.
let tru = (fun t -> (fun f -> t))
let fls = (fun t -> (fun f -> f))
let test = (fun l -> (fun m -> (fun n -> l m n)))
let and_bool = (fun b -> (fun c -> (b c) fls))

При записи выражения:
Код: plaintext
let x = and_bool tru tru

гавкает
авторstdin(27,5): error FS0030: Value restriction. The value 'x' has been inferred to have generic type
val x : ('_a -> '_b -> '_a)
Either make the arguments to 'x' explicit or, if you do not intend for it to be generic, add a type annotation.

при этом в хаскеле все работает отлично.

1. Из-за какого отличия в системе типов F# от хаскеля не работает этот код? Что мешает в качестве результата вычислений получить генерик?(я думал в дот нет генерики существуют в момент выполнения)
2. Какие можно добавить аннотации чтобы оно заработало?(может дурацкий вопрос, но мне это не очевидно)
...
Рейтинг: 0 / 0
07.05.2010, 13:48:42
    #36617306
Пилотажный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
ZyK_BotaN,

А не будет ли у Microsoft с F# то, что стало с J# и J++?
...
Рейтинг: 0 / 0
07.05.2010, 13:51:56
    #36617317
belugin4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
может тут что полезного написано

Не знаю, никогда так не теоретизировал
...
Рейтинг: 0 / 0
07.05.2010, 13:52:17
    #36617321
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
ПилотажныйZyK_BotaN,

А не будет ли у Microsoft с F# то, что стало с J# и J++?

хз, но я не думаю что J# и J++ были для кого-то интересны.
...
Рейтинг: 0 / 0
07.05.2010, 14:03:19
    #36617357
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
бестиповое лямбда-исчислениее, такое бестиповое

решил реализовать на хаскеле

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
tru = \t -> \f -> t
fls = \t -> \f -> f
test = \l -> \m -> \n -> l m n

and_bool = \b -> \c -> b c fls
or_bool = \b -> \c -> b tru c
not_bool = \b -> b fls tru

pair = \f -> \s -> \b -> b f s
first = \p -> p tru
second = \p -> p fls

c0 = \s -> \z -> z
c1 = scc c0
scc = \n -> \s -> \z -> s (n s z)
plus = \m -> \n -> \s -> \z -> m s (n s z)
times = \m -> \n -> m (plus n) c0
power  = \m -> \n -> n (times m) c1

iszro = \m -> m (\x -> fls) tru

zz = pair c0 c0
ss = \p -> pair (second p)(plus c1 (second p))
prd = \m -> first (m ss zz)
sub = \m -> \n -> n prd m

ch2st c = c ( 1 +)  0 
c3 = scc $ scc $ scc c0
c5 = scc $ scc c3

res = ch2st (sub c5 c3)

умножение и сложение работают отлично
декремент также работает
на попытку вычитания, гавкает ошибка:

авторcannot construct the infinite type


переписал слово в слово на динамической схеме, все отлично работает
вот только синтаксис хасклея для записи лямбда выражений мне больше нравится :(
...
Рейтинг: 0 / 0
07.05.2010, 14:09:42
    #36617376
belugin4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
list comprehension в F#
[quot ZyK_BotaNхз, но я не думаю что J# и J++ были для кого-то интересны.[/quot]

Ну J++ был весьма хорош в свое время - например Rational на нем писал ORM для VB (благодаря хорошей интеграции с COM).

Вот только засудили бедняжечку.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / list comprehension в F# / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]