Шаблон F #, соответствующий лямбдам - PullRequest
1 голос
/ 20 июля 2009

Я хочу установить значение IsParentRoot «0», если на входе «0», или выполнить некоторый код, если еще:

    let isParentRoot parVal =
        match parVal with
        | "0" -> "0"
        | x -> (fun x -> 
            "something")

Я пытаюсь это, но это не компилируется с ошибкой "This function takes too many arguments, or is used in a context where a function is not expected". Любая идея? Спасибо

Ответы [ 3 ]

3 голосов
/ 20 июля 2009

Разве вам не нужно указывать аргумент вашей функции для компиляции?

Что-то вроде

let isParentRoot parVal =
  match parVal with
    | "0" -> "0"
    | x -> (fun y -> "something") x

потому что в противном случае последнее совпадение попыталось бы вернуть функцию, которая возвращает строку, а первое - строку. Смешивание обоих не допускается.

Но я думаю, что ваш подход здесь может быть неправильным. Функции возвращают значения (или unit). Если вы хотите явно что-то изменить, общая функциональная идиома состоит в том, чтобы вернуть новое значение, в котором вы изменили то, что хотели изменить. Программирование с побочными эффектами (которые «устанавливают что-то на« 0 », если foo и делают что-то совсем другое, если не« будет ») в значительной степени не похоже на FP. Но я все еще новичок в F # и только начал два дня назад изучать язык, так что я могу ошибаться.

2 голосов
/ 20 июля 2009

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

Это будет работать:

let isParentRoot parVal =
        match parVal with
        | "0" -> (fun _ -> "0")
        | x   -> (fun _ ->  "something")

Если вы действительно хотите, чтобы ваше дело работало, вы можете выгружать оба возвращаемых значения в Object.

1 голос
/ 20 июля 2009

Вам не нужно определять ламбу на данный момент, я думаю, вы можете просто написать:

let isParentRoot parVal =
    match parVal with
    | "0" -> "0"
    | x -> CODE BLOCK
           GOES HERE

т.е. чтобы добавить x в список и прочитать список (просто чтобы здесь содержался содержательный код), вы можете просто написать:

let isParentRoot parVal =
    match parVal with
    | "0" -> "0"
    | x -> let roots = List.append oldroots x
           List.iter (fun r -> printfn "root: %s" r.ToString()) roots

Предполагая, что вы ранее определили свой старый список, который является.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...