LINUX.ORG.RU

[F#] Seq.length и seq<array>


0

2

почему нельзя узнать кол-во элементов в seq?:

let variants = filteredVariants_f intersection
// 'b * 'c -> 'd -> seq<Vertex array> 

let a = Seq.length variants  
//The type ''b * 'c -> 'd -> seq<Vertex array>' is not compatible with the type 'seq<'a>'

Также не понятно почему он недоволен явным типом, когда сам вывел такой же(причём однозначный):

let variants : Vertex array seq  = filteredVariants_f intersection
// This expression was expected to have type     seq<Vertex array>     but here has type     'a * 'b -> 'c -> seq<Vertex array>

А разве variants у тебя не функция 'b * 'c -> 'd -> seq<Vertex array>? А от функции посчитать Seq.length как то затруднительно думаю.

По выводу типов:

Компилятор не всегда правильно понимает обратную запись, так что рекомендую использовать скобки( (Vertex array) seq ) или юзать запись вида Seq<Array<Vertex>>. А ещё лучше пользоваться правилом - если компилятор выводит тип, то не делать аннотацию типов.

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

в filteredVariants_f последним выражением является вызов C#-ной ф-ции, почему же этот вызов возвращает лямбду?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

> в filteredVariants_f последним выражением является вызов C#-ной ф-ции, почему же этот вызов возвращает лямбду?

Я не телепат же. У тебя там написано:

//The type "b * 'c -> 'd -> seq<Vertex array>' is not compatible with the type 'seq<'a>'

Из чего я делаю вывод, что variants у тебя имеет тип 'b * 'c -> 'd -> seq<Vertex array>, а не seq<'a> как требует Seq.length.

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

ладно, ну теперь то тебе понятно что делается в той ф-ции, так в чём может быть проблемы, почему может быть такой тип?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

> ладно, ну теперь то тебе понятно что делается в той ф-ции, так в чём может быть проблемы, почему может быть такой тип?

Нет, не понятно. Я не умею по руке гадать, код приводи проблемный, тогда будет и решение.

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

по памяти:

первое - это IDictionary<Vertex, IEnumerable<Vertex>> второе - IEnumerable<Vertex[]> filteredVariants<Vertex> (IDictionary<Vertex, IEnumerable<Vertex>> intersection)

код смогу только во вторник скопипастить

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Ну я сделал что-то похожее, у меня всё заработало с ходу. Вот пример:

C# либа: http://pastebin.com/KXUZ5asV

F# заюз этой либы: http://pastebin.com/nLXJ9UKX

Так что нужен сам проблемный код для того, чтобы сказать что-либо конкретное.

Norgat ★★★★★
()
Ответ на: комментарий от pseudo-cat

По идее CL должен закалять программиста так, что какие-то типы ему уже не должны быть страшны :)

dave ★★★★★
()
Ответ на: комментарий от dave

По идее CL должен закалять программиста так, что какие-то типы ему уже не должны быть страшны :)

по F# пока не так много инфы(аля вопрос - ответ) в инете, а времени на его подробное изучение сейчас нету. Мне просто нужно переписать часть проекта на F#, причём достаточно быстро

Ты, кстати, какую книгу по F# читаешь?

пробежал msdn-введиние

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Тогда вопросов может быть много, если до этого не изучал ocaml, с которым ядро у f# общее. Иначе msdn-введения будет мало. Без книг будет трудно.

На просторах инета можно найти в электронном виде Expert F#, Expert F# 2.0, Programming F# и Foundations of F#. Мне понравилась Programming F#, но я ее читал после Expert F#.

dave ★★★★★
()
Ответ на: комментарий от dave

Спасибо, я не думал что там может быть что-то действительно трудное) Programming F# на русском после сессии обязательно почитаю)

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

(первый параграф можно не читать) Русский перевод особо не смотрел, да и видел всего лишь одну главу. Но там, мне кажется, лажанулись с термином «асинхронное вычислительное выражение». На мой взгляд было бы правильнее «асинхронное вычисление», тем более, что монада - это пример «вычисления». А вычислительное выражение - это синтаксическая конструкция для задания тех самых вычислений. Вычисление может быть асинхронным, а синтаксическая конструкция - нет.

В общем, лучше читать на инглише. Там с терминологией все лучше обстоит, хотя тут был один эстет на рсдн, который придирался к понятию currying :)

dave ★★★★★
()
Ответ на: комментарий от dave

хотя тут был один эстет на рсдн, который придирался к понятию currying :)

это понятие вроде вполне формализовано и общепризнанно)

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от Norgat

Да, там оказывается не просто вызов си-шарпной ф-ции - последние выражение, а, собственно, результат collect, вот:

let filteredVariants_f (intersection : IDictionary<Vertex, Vertex seq>) 
                       (reserv : Vertex seq * Vertex seq)
                       (acc : IDictionary<Vertex, Vertex>) = 
    let variants = allVariants_f intersection
    match Seq.length variants with 
        | 0 -> Seq.empty
        | _ ->
            let filteredVariants =
                Seq.collect
                    (fun (vrnt : Vertex array seq) ->  
                        (Seq.filter
                             (fun (conform : Vertex array) ->                               
                                 let (conf1, conf) 
                                     = (Array.get conform 0, Array.get conform 1) 
                                 let (containCar, containCdr)
                                     = (acc.ContainsKey (Array.get conform 0),
                                         acc.Values.Contains (Array.get conform 1))
                                 let (reservedVg , reservedG) 
                                     = (reservedP_f (Array.get conform 0) (fst reserv),
                                         reservedP_f (Array.get conform 1) (snd reserv))
                                 ((not containCar) && (not containCdr) 
                                     && (not reservedVg) && (not reservedG)))
                            vrnt))
                    variants
            filteredVariants

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Нутк... ты ж походу её каррируешь, вот у тебя на выходе и получается функция, а не последовательность.

Смотри:

filteredVariants_f(схематично) имеет сигнатуру

IDictionary -> int seq * int seq -> IDidtionary -> int seq

Соотв. после

let variants = filteredVariants_f intersection

variants у тебя будет не int seq, а int seq * int seq -> IDidtionary -> int seq. Откуда очевидна жалоба Seq.length на неправильный параметр.

Вот упрощённый работающий вариант: http://pastebin.com/s2VZqEXU

Norgat ★★★★★
()
Ответ на: комментарий от pseudo-cat

это понятие вроде вполне формализовано и общепризнанно)

По-моему нет. В книге Programming F# не делается разницы между currying и partial application, хотя автор книги Крис Смит, ныне работающий в гугле, работал в одной команде с Доном Саймом. То есть, люди авторитетные. С другой стороны, в хаскеле под каррированием имеется ввиду другое.

Тот эстет с рсдн пытался применить хаскелевскую терминологию к f#, и был, кстати, не понят Владом Чистяковым и даже предупрежден ;)

Мне дак все равно, что здесь чем называется. Главное, чтобы люди понимали друг друга :)

dave ★★★★★
()
Ответ на: комментарий от Norgat

ааа, т.е., если не дать ф-ции все аргументы, а лишь часть, она вернёт ф-цию, с уже данными аргументами в замыканиях. В общем какой-то из этопов карринга, т.е. то о чём ты мне уже говорил раньше? Ай, а я совсем невнимательный стал)

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от dave

> На просторах инета можно найти в электронном виде Expert F#, Expert F# 2.0, Programming F# и Foundations of F#. Мне понравилась Programming F#, но я ее читал после Expert F#.

Мне понравилась ещё F# for Scientists (примеры кода + разбор fslex, fsyacc, оптимизация) и Функциональное программирование на F# Сошникова(опять же примерами).

Norgat ★★★★★
()
Ответ на: комментарий от dave

> На мой взгляд было бы правильнее «асинхронное вычисление»

Имхо, они пытаются этим подчеркнуть сахар conputation expressions. И таки да, это копипаста с MSDN'овского робоперевода всего навсего.

Norgat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.