2017-01-15 4 views
2

Я пытаюсь написать функцию, где у меня есть вспомогательная функция, 'a -> bool. Моя проблема в том, когда я пытаюсь использовать возвращаемое значение из этой вспомогательной функции, я получаю ошибку (потому что это функция?)Проверка равенства в F #

Тип 'a -> bool' does not support the 'equality' constraint,

Есть способ заставить его предварительно оценить функцию, чтобы я мог использовать возвращаемое значение?

Пример:

let primelist n = 
    let rec prim n = function 
     | []     -> true 
     | x::xs when n % x = 0 -> false 
     | x::xs    -> prim n xs 

    let rec help n list = function 
     | n when (prim n = true) -> List.rev (n::list) 
     | n      -> List.rev list 
     | i when (prim i = true) -> help n (i::list) (i+1) 
     | i      -> help n list (i+1) 
    help [2] n 
+0

Только что нашел свою ошибку ^^ – kam

ответ

2

Нечто подобное будет делать трюк:

let primelist n = 
    let rec prim n = function 
     | []     -> true 
     | x::xs when n % x = 0 -> false 
     | x::xs    -> prim n xs 

    let rec help n list arg = 
     let prime n = prim n list 
     match arg with 
     | n when (prime n = true) -> List.rev (n::list) 
     | n      -> List.rev list 
     | i when (prime i = true) -> help n (i::list) (i+1) 
     | i      -> help n list (i+1) 
    help [2] n 

Здесь я использовал выделки, чтобы создать новую функцию.

+3

Не '| n, когда (prime n = true) 'и' | i, когда (prime i = true) 'дубликаты случаев? '| n' и '| i'? – ildjarn

+0

определенно выглядит так, но я подумал, что просто исправить одну вещь за раз –

Смежные вопросы