Весь смысл чтения файла - получить состояние, которого у вас не было раньше. Поэтому я не совсем понимаю, что вы ищете.
Можно сделать вид, что в качестве входного (и выходного) параметра используется целая вселенная, и создать «функциональный» аналог, но я никогда не видел четкой демонстрации того, что он имеет какие-либо превосходные характеристики.
Большинство функциональных структур данных позволяют вам абстрагироваться от номера копии. Например, список позволяет распространять операции над отдельным элементом на все элементы удобным способом (отобразить, уменьшить и т. Д.). Но когда вы хотите прочитать файл, вам нужно абстрагироваться от типа данных, и, более того, вы на самом деле не хотите, чтобы он полностью абстрагировался - вы хотите соответствовать какому-либо шаблону, который вы ожидаете. Как вы указываете этот шаблон - и что делать при возникновении ошибок - я подозреваю, в основе вашей проблемы чтения двоичных файлов.
(Обратите внимание, что если вы не используете один из этих многоядерных Sun-боксов (например, T2000), вам не требуется неизменность для безопасности, так как один поток достаточно быстр для обработки всех низкоуровневых входных данных обработка.)
Одна из возможностей - это считать чтение двоичных файлов проблемой синтаксического анализа. В Scala пока нет надежной библиотеки для этого, но см. этот поток , где приведен хороший код, написанный Полом Филлипсом, который помогает в этом отношении.
Еще одна возможность - создать какой-то шаблон самостоятельно, например
List(classOf[Float],classOf[Int],classOf[String])
и затем напишите что-то, что последовательно анализирует этот поток с помощью операторов сопоставления:
val FloatClass = classOf[Float]
listEntry match {
case FloatClass => // Read float
...
}
Подобные вещи значительно упрощают чтение бинарных файлов, и это как минимум своего рода функционал , поскольку вы можете отобразить свой входной поток байтов в List[Any]
и затем использовать сопоставление с образцом, чтобы получить нужные данные.