Как использовать вместе «let» и «where»? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть следующий код

initModel :: [Double] -> Model
initModel xs = do
 let weights = [f x | x <- xs]
     biases = [g x | x <- xs]

, и я хотел бы определить f и g, добавив предложение where в конце функции initModel. Но когда я добавил вот так

initModel :: [Double] -> Model
initModel xs = do
 let weights = [f x | x <- xs]
     biases = [g x | x <- xs]
  where
   f x = x
   g x = x
 Model weights biases

, последняя строка дает ошибку Parse error on input 'Model'. Я пробовал много комбинаций отступов для предложения where, но пока ни одна из них не сработала.

1 Ответ

4 голосов
/ 19 июня 2020

Ниже показаны некоторые возможные варианты:

initModel xs = do
  let weights = [f x | x <- xs]
        where f x = x
      biases = [g x | x <- xs]
        where
          g x = x
  Model weights biases

initModel xs = do
  let weights = [f x | x <- xs]
      biases = [g x | x <- xs]
  Model weights biases
  where
  f x = x
  g x = x

В общем: where должен быть присоединен к привязке (равенство или предложение в case), и поэтому с отступом должен быть больше переплет; и любые привязки внутри where должны иметь отступ не меньше, чем любой охватывающий блок (больше, чем закрывающий блок, если вы хотите продолжить закрывающий блок позже).

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