Вложенный пусть в англиканском Clojure - PullRequest
0 голосов
/ 23 сентября 2018

Я новичок в англиканском, вероятностном языке программирования в Clojure.Я пытаюсь использовать вложенную конструкцию let в Clojure.

Следующая defquery работает без проблем.

(defquery panda3 [p1]
  (let [p2 (sample 
              (categorical
                {:speA (/ 1 2),
                 :speB (/ 1 2)}))]
    (if (= p2 :speA)
      ( let [p3 (sample 
              (categorical
                {:twins (/ 1 10),
                 :notwins (/ 9 10)}))] 

      )
      ( let [p3 (sample 
              (categorical
                {:twins (/ 2 10),
                 :notwins (/ 8 10)}))]

      ))

    p2))

Однако вместо того, чтобы возвращать значение p2 в конце, если я пытаюсь вернуть значение p3, он возвращает ошибки.

(defquery panda3 [p1]
  (let [p2 (sample 
              (categorical
                {:speA (/ 1 2),
                 :speB (/ 1 2)}))]
    (if (= p2 :speA)
      ( let [p3 (sample 
              (categorical
                {:twins (/ 1 10),
                 :notwins (/ 9 10)}))] 

      )
      ( let [p3 (sample 
              (categorical
                {:twins (/ 2 10),
                 :notwins (/ 8 10)}))]

      ))

    p3))

Идея состоит в том, чтобы назначить p3 на основе результата p2.Однако я не могу этого сделать.Что я делаю неправильно?

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

1 Ответ

0 голосов
/ 23 сентября 2018

Как сказано в комментарии, вам необходимо вернуть p3 из области действия let, в которой оно определено:

(defquery panda3 [p1]
  (let [p2 (sample 
              (categorical
                {:speA (/ 1 2),
                 :speB (/ 1 2)}))]
    (if (= p2 :speA)
      (let [p3 (sample 
                 (categorical
                   {:twins (/ 1 10),
                    :notwins (/ 9 10)}))] 
        p3)
      (let [p3 (sample 
                 (categorical
                   {:twins (/ 2 10),
                    :notwins (/ 8 10)}))]
        p3 ))))

Update

Как указывает Амаллой, 2-я часть может быть:

  ; return the result of `(sample (categorical ...))` called
  ; with one of the 2 maps
  (if (= p2 :speA)
    (sample 
      (categorical
        {:twins (/ 1 10),
         :notwins (/ 9 10)} ))
    (sample 
      (categorical
        {:twins (/ 2 10),
         :notwins (/ 8 10)} )))

или даже

  ; return the result of `(sample (categorical ...))` called
  ; with one of the 2 maps
  (sample 
    (categorical
      (if (= p2 :speA)
        {:twins (/ 1 10),
         :notwins (/ 9 10)}
        {:twins (/ 2 10),
         :notwins (/ 8 10)} )))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...