Когда destructuring кортежи в Haskell, где элементы могут использоваться?

В прошлом я успешно подключал PBI к многомерным кубам без проблем. Чтобы убедиться в этом, я запустил PBI Desktop, чтобы проверить это. К моему удивлению, я столкнулся с той же проблемой. Я также хотел поделиться своим опытом.

Подключения:

Я пытался подключить PBI Desktop to my SSAS instance on Server 'GCOD039', DEV-сервер . К моему удивлению, я получил сообщение об ошибке (такое же сообщение об ошибке, как OP). В шоке я попытался подключить PBI Desktop to SSAS on Server 'GCOP039', PROD Server . Соединение 'GCOP039' установлено успешно. Затем я попытался Excel connection to 'GCOD039' ... это прекрасно работает. Итак, почему PBI не подключается?

Я представил этот сценарий своему коллеге (администратору SSAS), он проверил соединение на своем ПК с GCDO039, и оно сработало для него. Он предложил мне перезагрузить компьютер. Я сделал, и мое соединение с «GCOD039» все еще не удалось. В настоящее время мы оба в тупике.

Я работаю, чтобы найти ответ на вопрос, что может вызвать это ...

PBIDesktop-SSASMD-connection-issue.png enter image description here

6
задан C. A. McCann 17 December 2011 в 22:57
поделиться

4 ответа

Видя Ваше редактирование, я думаю, что Вашим выяснением о является Сопоставление с образцом.

И отвечать на Ваш вопрос: Да, что-либо, что можно создать, можно также 'вскрыть противоречия' в использовании конструкторов. Например, Вы, вероятно, знакомы с этой формой сопоставления с образцом:

head :: [a] -> a
head (x:xs) = x
head []     = error "Can't take head of empty list"

Однако существует больше мест, где можно использовать сопоставление с образцом, другие действительные нотации:

head xs = case xs of
              (y:ys) -> y
              []     -> error "Can't take head of empty list"

head xs = let (y:ys) = xs
          in y

head xs = y
  where
    (y:ys) = xs

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


Хотя эти примеры характерны для списков, можно сделать то же с другими типами данных, как так:

first :: (a, b) -> a
first tuple = x
  where
    (x, y) = tuple

second :: (a, b) -> b
second tuple = let (x, y) = tuple
               in y

fromJust :: Maybe a -> a
fromJust ma = x
  where
    (Just x) = ma

Снова, последняя функция также откажет при вызове ее с Nothing.

Подводя итоги; если можно создать что-то с помощью конструкторов (как (:) и [] для списков, или (,) для кортежей, или Nothing и Just для, Возможно), можно использовать тех тех же конструкторов, чтобы сделать сопоставление с образцом во множестве путей.

13
ответ дан 8 December 2019 в 14:48
поделиться

Другим способом посмотреть на него является тот код как это

x where x = 3

примерно эквивалентно

let x = 3 in x
1
ответ дан 8 December 2019 в 14:48
поделиться

Действительно ли я прав относительно этого поведения?

Да. Имена существуют только в блоке, где Вы определили их, все же. В Вашем случае это означает логическую единицу что Ваш where к пункту относятся, т.е. выражение внутри fList.

2
ответ дан 8 December 2019 в 14:48
поделиться

Да, Вы правы. Имена связали в, где пункт видим к полному объявлению, предшествующему где пункт. В Вашем случае те имена f и bar.

(Одна из твердых вещей об изучении Haskell - то, что оно только разрешено, но распространено для использования переменных в исходном коде в местоположениях, которые предшествуют местоположениям, где те переменные определяются.)

Место для чтения больше о том, где пункты находится в Отчете о Haskell 98 или в одном из многих прекрасных учебных руководств, которые будут найдены в haskell.org.

0
ответ дан 8 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: