Вывод типа при сопоставлении с образцом по списку - PullRequest
0 голосов
/ 07 октября 2011

Я застрял при попытке создать функцию, которая будет выполнять следующее:

let p = [1, 2, 4, 2, 1]
let v = 8

, затем я хочу просмотреть элементы в a, пока не найду индекс iодин, где все элементы вплоть до i больше или равны v.Таким образом, в этом случае должно возвращаться 4, потому что 1 + 2 + 4 <8 и 1 + 2 + 4 + 2> 8. Таким образом, в 4-м элементе значение 2 дает общее значение более 8.

(некоторыеСправочная информация: я хочу сделать Монте-Карло, где у меня есть список вероятностей, которые складываются до 1. Затем я передаю случайное число от 0 до 1, чтобы оно выбрало одно из возможных будущих состояний. Простой пример здесь с целыми числами)

То, что у меня пока есть, таково:

let p = [1, 2, 4, 2, 1]

let pick (v:int) (l:int list) = 
    let rec sub (i:int) (acc:int) (l2:int list) =
        match l2 with
        | h::t -> if acc+h >= v then i else sub(i+1, acc+h, t)
        | _ -> failwith "total list didn't amount to " + v
    sub 0 0 l

pick 8 p

Но это дает следующую ошибку в бите sub(i+1, acc+h, t):

error FS0001: This expression was expected to have type
    int    
but here has type
    int -> int list -> int 

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

Как заставить его вернуть результат функции?

Заранее спасибо,

Герт-Ян

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Во-первых, p будет пониматься как [(1, 2, 4, 2, 1);], то есть (int*int*int*int*int) list только с одним элементом.p как int list должно быть [1; 2; 4; 2; 1].

Во-вторых, sub(i+1, acc+h, t) в строке 6 следует вызывать в форме карри, а не в форме кортежа.Коррекция sub (i+1) (acc+h) t.

2 голосов
/ 07 октября 2011

вы даете 3 кортежа (i+1,acc+h,t), где предполагается, что функция карри:

| h::t -> if acc+h >= v then i else sub (i+1) (acc+h) t

Попробуйте это.

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