Как стать автором
Обновить

Комментарии 22

Проходили на втором курсе, было приятно вспомнить контрольные на 6 часов. По коду много замечаний (н-р Zero лучше сделать object), напишу утром.
Пишите, буду рад замечаниям, ибо в Scala опыта очень мало
Извините, очень жесткий запар на работе. Если действительно интересны замечания, то выложите на github и я посмотрю.

Вот мой пример в догонку
package org.example

trait Num {
	def value: Int
}

object Zero extends Num {
	val value = 0
}

case class Succ(arg: Num) extends Num {
	val value = arg.value + 1
}

case class Proj( idx: Int, args: Num*) extends Num {//буду считать, что n содержится в args
	require(!args.isEmpty)
	require(0 <= idx && idx < args.size)

	def value = args(idx) value
}

case class Sum(a: Num, b: Num) extends Num {
	def value = (b match {
						case Zero => a
						case Succ(num) => Succ(Proj(2, a, num, Sum(a, num))) 
					}) value
}


object ExampleApp extends App {
	val one = Succ(Zero)
	val two = Succ(Succ(Zero))
  
  	println(Sum(one, two) value)
}

Ваш пример не совсем то, что я хотел получить. Ваше определение succ использует сложение, которое еще не определено, а я же хотел не использовать в принципе нативные классы типа Int и соответственно операции с ними связанные, дабы показать, как определить число как таковое, базируясь на рекурсии и только. Никакого практического интереса в этом конечно нет, но для понимания возможностей рекурсивных функций это, на мой взгляд, хороший пример.
Да, я знал, что вы так скажите =). Ваш пример безусловно хорош этим.
Я использовал Int и операции с ним так как 0 и +1 определены, value только вычисляет выражение.
Я только хотел примером показать, как понятнее становится код, если использовать возможности языка (чем на мой взгляд, ваш пример очень хромает).
Как смогу выложу куда-нибудь. В любом случае, я уверен что ту же идею можно реализовать оптимальней :-) спасибо за комментарий
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Впечатлён лаконичностью и интуитивностью приведённого кода.
Благодарю. Но, как верно заметил btd, он далеко не идеале и его надо бы допилить.
А ссылочка на архив прокомментированного кода будет?
И можно тоже самое, только на ANSI C? )))
Архив с комментированным кодом будет, надеюсь, в течении недели, если времени будет. А вот на ansi c — врятли. Очень плохо знаю с, да и не предназначен он, на мой взгляд, для таких задачь… но если у вас будет желание реализовать — было бы интересно посмотреть :-)
Похоже на выжимку из начала TAPL'а.
А где же функция Аккремана? :-) Вот здесь похожая реализация множеств.

Пара мелких замечаний: s/вИЮ/Inf (Что это за раскладка?), s/Predicat/Predecessor/.
Функцию Аккремана решил не включать в пост, дабы не запутаться в бесконечных бесконечностях ) Думаю рассказать о ней в следующей статье, если интересно кому-нибудь будет.
Оу, статья о Computer Science! Большое спасибо!
Я вот сейчас подумал, и понял что, в принципе, даже операцию сравнения можно реализовать в виде функции, а если очень постараться — то и конструкция if else можно сделать отдельной функцией. Собственно на этом и построена scala… если кому интересно, могу добавить в пост
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Прочитал определение рекурсивной функции. По-вашему число итераций должно быть известно заранее?
Интересно, а как бы вы определили вычисление множества Мандельброта, где число итераций рекурсивной функции — искомое значение?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации