Перейти к содержимому


- - - - -

F#


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 DarkMaster

DarkMaster
  • Мыслитель

  • Power User
  • 1 801 сообщений
  • Пол:Мужчина
  • Город:Северное Бутово

Отправлено 10.10.2008 - 14:13

Волею судеб, пришлось столкнуться с таким языком как F#. Но так как он относительно молод, то найти по нему мануальчик, учебник, и даже просто нормальное объяснение весьма проблематично. Вот я и решил поинтересоваться, может кто-нибудь знает ресурсы, где можно в доступной форме ознакомиться с этим языком? Я пока нашел лишь 2 таких места:
место 1
место 2
Так же нашел и книгу, но, увы, только на английском.

#2 drnet

drnet
  • ♞♞♞♞♞♞♞♞♞

  • Динозавр Форума
  • 8 810 сообщений
  • Пол:Мужчина
  • Город:
  • Интересы:В детстве был конструктор Лего, увлечение осталось.<br />Создал свой Лего для взрослых :)

Отправлено 10.10.2008 - 16:54

Можно по этому смотреть http://ocaml.spb.ru/

#3 DarkMaster

DarkMaster
  • Мыслитель

  • Power User
  • 1 801 сообщений
  • Пол:Мужчина
  • Город:Северное Бутово

Отправлено 13.10.2008 - 01:11

Благодарю! Теперь почитаааем....

#4 travanna

travanna
  • Пользователь

  • Пользователь
  • 136 сообщений

Отправлено 13.10.2008 - 02:16

Документация к ocaml плохая, на русском языке вообще мало материалов. А сам язык - очень хороший. Программы там обычно запускаются с первого раза и работают правильно - главная проблема будет - скомпилировать. Сложные алгоритмы на этом языке записываются в несколько строчек. Я как-то реализовал обход графа с поиском циклов в три строчки кода. Синтаксис языка - примитивный - в академической версии нет ни переменных, ни циклов, ни присваиваний.

#5 DarkMaster

DarkMaster
  • Мыслитель

  • Power User
  • 1 801 сообщений
  • Пол:Мужчина
  • Город:Северное Бутово

Отправлено 13.10.2008 - 14:46

Просмотр сообщенияtravanna (13 Октября 2008, 3:16) писал:

Документация к ocaml плохая, на русском языке вообще мало материалов. А сам язык - очень хороший. Программы там обычно запускаются с первого раза и работают правильно - главная проблема будет - скомпилировать. Сложные алгоритмы на этом языке записываются в несколько строчек. Я как-то реализовал обход графа с поиском циклов в три строчки кода. Синтаксис языка - примитивный - в академической версии нет ни переменных, ни циклов, ни присваиваний.

Не могли бы вы посоветовать хороший материал для освоения данного языка?

#6 Буги

Буги
  • Полиграф

  • Power User
  • 1 017 сообщений
  • Пол:Мужчина
  • Город:Москва
  • Интересы:Музыка

Отправлено 13.10.2008 - 21:16

Он практически где-нибуть применялся?

#7 drnet

drnet
  • ♞♞♞♞♞♞♞♞♞

  • Динозавр Форума
  • 8 810 сообщений
  • Пол:Мужчина
  • Город:
  • Интересы:В детстве был конструктор Лего, увлечение осталось.<br />Создал свой Лего для взрослых :)

Отправлено 13.10.2008 - 22:24

Язык задуман как некая реализация OCaml для .NET. Удобен в плане математических вещей. В общем для технарей.

#8 DarkMaster

DarkMaster
  • Мыслитель

  • Power User
  • 1 801 сообщений
  • Пол:Мужчина
  • Город:Северное Бутово

Отправлено 14.10.2008 - 12:36

Вот как раз для математических вещей ее и использую. Вот хотелось бы понять, как на нем считать матрцицы произвольных размеров. Есть знающие люди?

#9 drnet

drnet
  • ♞♞♞♞♞♞♞♞♞

  • Динозавр Форума
  • 8 810 сообщений
  • Пол:Мужчина
  • Город:
  • Интересы:В детстве был конструктор Лего, увлечение осталось.<br />Создал свой Лего для взрослых :)

Отправлено 14.10.2008 - 13:28

DarkMaster, есть сборка FSharpForNumerics только она стоит в районе 100 баксов.
Используй простарнство имён  Microsoft.FSharp.Math.Matrix.Generic если она из чисел с плавающей точкой.
Пример умножения матриц:

#light
#r @"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll"
#R @"C:\Program Files\Microsoft Parallel Extensions Dec07 CTP\System.Threading.dll"

open System
open System.Threading 

/// Измерение времени выполнения функции
let Time f =
	let timer = System.Diagnostics.Stopwatch.StartNew ()
	let y = f ()
	printfn "Time taken = %O" timer.Elapsed
	y 

/// Демка параллельного умножения матриц http://mlg.eng.cam.ac.uk/jurgen/blog/?p=6

let MatrixMultiplyDemo () =
	/// Обыкновенное умножение
	let Multiply (A: float[,]) (B: float[,]) =
		let n = Array2.length1 A
		let C = Array2.create n n 0.0
		for i = 0 to (n-1) do
			for j=0 to n-1 do
				for k=0 to n-1 do
					C.[i,j] <- C.[i,j] + A.[i,k] * B.[k,j]
		C
	/// Быстрое умножение с использованием алгоритма Parallel-FX

	let PFXMultiply (A: float[,]) (B: float[,]) =
		let n = Array2.length1 A
		let C = Array2.create n n 0.0
		let RowTask i =
			for j=0 to n-1 do
				for k=0 to n-1 do
					C.[i,j] <- C.[i,j] + A.[i,k] * B.[k,j]
		Parallel.For(0, (n-1), new Action<int>(RowTask))
		C
	let n = 1000
	let A = Array2.init n n (fun i j -> float (i * j))
	let B = Array2.init n n (fun i j -> float (i * j))
	printf "[Ordinary multiply of %dx%d matrix]   " n n
	Time (fun () -> Multiply A B) |> ignore
	printf "[Fast multiply of %dx%d matrix]	   " n n
	Time (fun () -> PFXMultiply A B) |> ignore

do
	/// Печать строки с заголовком
	let PrintWithHeading s =
		let line = String.make (s |> String.length) '='
		printfn "%s\n%s" s line	   

	printfn "Parallel FX demos\n2007\n\n"

	PrintWithHeading "Matrix Multiply"
	MatrixMultiplyDemo ()  

	printfn "\n\nPress any key to finish"
	read_line () |> ignore

Используется во втором случае Microsoft Parallel Extenions для .NET 3.5. Это эффективно в случае кводов от Интела.

#10 DarkMaster

DarkMaster
  • Мыслитель

  • Power User
  • 1 801 сообщений
  • Пол:Мужчина
  • Город:Северное Бутово

Отправлено 14.10.2008 - 14:16

Насколько я могу судить, тут для простого умножения используют это:
for i = 0 to (n-1) do
			for j=0 to n-1 do
				for k=0 to n-1 do
					C.[i,j] <- C.[i,j] + A.[i,k] * B.[k,j]
Мне бы хотелось узнать, как реализовать умножение с помощью функции, которая присутствуетв языке, при подключении FSharp.PowerPack.Math.Providers.

#11 DarkMaster

DarkMaster
  • Мыслитель

  • Power User
  • 1 801 сообщений
  • Пол:Мужчина
  • Город:Северное Бутово

Отправлено 15.10.2008 - 14:14

Вычисление детерминанта таки нашлось. Но с перемножением пока никак.
#light
#r "FSharp.PowerPack.dll"
 
open Microsoft.FSharp.Math
 
let det (m:matrix) =
	let rec detAux acc (m:matrix) = 
		let topLeftItem = m.[0,0]
		if m.NumCols = 1  topLeftItem = 0.0 then acc * topLeftItem
		else
			let topRow = m.Row 0
			let leftCol = m.Column 0
			let m1 = m > Matrix.mapi (fun row col value -> 
				if leftCol.[row] = 0.0 then value 
				else value * topLeftItem - topRow.[col] *  leftCol.[row]
				)
 
			m1.[1..,1..] |> detAux (acc*topLeftItem)
 
	if m.NumCols <> m.NumRows then raise (new System.ArgumentException("Матрица должна быть квадратной","m"))
	else
		detAux 1.0 m
 
let detZero = det (Matrix.zero 10 10)
printfn "Определитель нулевой матрицы равен %f" detZero
 
let detIdent = det (Matrix.identity 10)
printfn "Определитель единичной матрицы равен %f" detIdent
 
let diag = [for i in [1..10] -> float i]
print_any diag
printfn ""
 
let detDiag = det (Matrix.init_diagonal (Vector.of_list diag))
printfn "Определитель диагональной матрицы равен %f, должен быть %f" detDiag (List.fold_left (*) 1.0 diag)
 
let m = 
	[[1.0 2.0 3.0]
	 [4.0 5.0 6.0]
	 [7.0 8.0 9.0]]
	|> Matrix.of_list
 
print_any m
printfn ""
 
let detFixed = det m
printfn "Определитель матрицы равен %f, должен быть %f" detFixed 0.0
 
printfn "Определитель случайной матрицы равен %f" (det (Matrix.randomize m))





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей