Проблема в том, что функция не возвращает значение. Функции всегда должны возвращать значение. Если возвращать нечего, верните unit
. Вы можете вернуть единицу как ()
.
Я сделал здесь несколько неправильных предположений, но попытался уточнить, что это были. В функции trans
я также показываю, как вы можете указать тип возвращаемого значения. Обычно лучше позволить компилятору выводить тип, пока он не сможет. Наведите указатель мыши на функции и посмотрите, что компилятор говорит вам о типах. string -> int -> string list
означает, что функция принимает строку и целое число и возвращает список строк.
let init dirName = () //unit is returned... kind of like void but is actually a return value
let listOfVmFiles dirName = ["some";"files"] // list of string
let readFile path = "content of file" //string
let trans(dirPath:string) : string list = // takes a string and returns a list of string represented as string-> string list
let vmFiles = listOfVmFiles(dirPath) // get files from path
if(vmFiles.Length > 1) then init("") // init if more than 1 file
List.map readFile vmFiles // return a list of the content of the files
Если функция выполняет побочный эффект и ничего не возвращает, то это можно сделать так:
let trans(dirPath:string) : unit =
let vmFiles = listOfVmFiles(dirPath)
if(vmFiles.Length > 1) then init("")
List.map readFile vmFiles |> ignore //ignore the result
()
При этом игнорируется результат сопоставления функции readFile
со списком, а затем возвращается unit
с использованием ()
.
Я рекомендую fsharp для развлечения и прибыли для изучения fsharp.
Надеюсь, что это помогает и удачи. Хотя синтаксис кажется странным изначально придерживаться его. Это здорово!