Функции в F # дискриминационных союзах - PullRequest
3 голосов
/ 01 декабря 2010

Есть ли способ использовать функции в дискриминационных союзах?Я пытаюсь сделать что-то вроде этого:

Type Test<'a> = Test of 'a-> bool

Я знаю, что это возможно в Haskell с использованием newtype, и мне было интересно, каким будет эквивалент в F #.* Спасибо.

Ответы [ 2 ]

5 голосов
/ 01 декабря 2010
type Test<'A> = Test of ('A -> bool)
4 голосов
/ 02 декабря 2010

В качестве дополнения к ответу desco вы можете применить функцию, привязанную к Test с сопоставлением с образцом:

type Test<'a> = Test of ('a -> bool)

// let applyTest T x = match T with Test(f) -> f x
// better: (as per kvb's comment) pattern match the function argument
let applyTest (Test f) x = f x

Пример:

// A Test<string>
let upperCaseTest = Test (fun (s:string) -> s.ToUpper() = s)

// A Test<int>
let primeTest =
    Test (fun n ->
        let upper = int (sqrt (float n))
        n > 1 && (n = 2 || [2..upper] |> List.forall (fun d -> n%d <> 0)) 
    )

В FSI:

> applyTest upperCaseTest "PIGSMIGHTFLY";;
val it : bool = true
> applyTest upperCaseTest "PIGSMIgHTFLY";;
val it : bool = false
> [1..30] |> List.filter (applyTest primeTest);;
val it : int list = [2; 3; 5; 7; 11; 13; 17; 19; 23; 29]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...