2013-11-20 3 views
-3

У меня есть рекурсивная функция, работающая в рамках строго определенного интерфейса, поэтому я не могу изменить сигнатуры функций.Работает ли Data.Map в методе pass-by-value или pass-by-reference? (Лучшее объяснение внутри)

Код компилируется отлично и даже запускает штрафы без ошибок. Моя проблема в том, что это большой набор результатов, поэтому очень сложно проверить, есть ли семантическая ошибка.

Мой основной вопрос: В последовательности вызовов функций A to B to A to B to breaking condition, учитывая ту же самую исходную карту, передается всем функциям до нарушения условия, а некоторые функции возвращают Integer, будет ли вставка на карте в функцию, которая возвращает только целочисленное значение, которое будет отражено после возврата элемента управления к первой функции?

primaryFunc :: SuperType -> MyMap -> (Integer, MyMap) 
primaryFunc (SubType1 a) mapInstance = do 
    let returnInt = func1 a mapInstance 
    (returnInt, mapInstance) 
primaryFunc (SubType2 c) mapInstance = do 
    let returnInt = primaryFunc_nonprefix_SuperType c mapInstance 
    let returnSuperType = (Const returnInt) 
    let returnTable = H.insert c returnSuperType mapInstance 
    (returnInt, returnTable) 
primaryFunc (ConstSubType d) mapInstance = do 
    let returnInt = d 
    (returnInt, mapInstance) 

func1 :: SubType1 -> MyMap -> Integer  
func1 oe vt = do 
    --do stuff with input and map data to get return int 
    returnInt = primaryFunc 
    returnInt 

func2 :: SubType2 -> MyMap -> Integer 
func2 pe vt = do 
    --do stuff with input and map data to get return int 
    returnInt = primaryFunc 
    returnInt 
+1

Что такое 'MyMap', а что такое' SuperType'/'SubTypeₓ'? (Звучит подозрительно во всяком случае: в Haskell нет подтипов. Ваш код не должен даже проверяться на практике.) – leftaroundabout

+0

Data SuperType = SubType1 sb1 | SubType2 sb2 outputing (Eq, Ord, Show) – user3013086

+2

Почему это завалено нотными обозначениями, но не в монаде? Я думаю, вам нужно почитать о каком-то базовом хаскеле, посмотрели ли вы на «Учиться тебе Хаскелл за великое благо»? – jozefg

ответ

4

Ваш вопрос практически невозможно плотно и неоднозначный, но это должно быть возможно ответить на то, что вы называете ваш «первичный» вопрос от простейших первых принципов Haskell:

    функция
  • Нет Haskell обновляет значение (например, карта). В лучшем случае он может вернуть измененную копию своего ввода.
  • Вне монады IO никакая функция не может иметь побочных эффектов. Никакая функция не может влиять на значение любой переменной, назначенной до ее вызова; все, что он может сделать, это вернуть значение.

Таким образом, если вы передадите карту в качестве параметра функции, то никакая функция не может изменить вашу существующую ссылку на это значение. Если вы хотите обновленное значение, вы можете получить только это из выходной функции функции, в которую вы отправили исходное значение в качестве ввода. Новое значение, новая ссылка.

Из-за этого вы должны иметь абсолютную ясность на любой глубине вашей сети функций, с какими значениями вы работаете. Зная это, вы должны быть в состоянии ответить на собственный вопрос. Честно говоря, это такая фундаментальная характеристика Хаскелла, что я недоумеваю, что вам даже нужно спросить.

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

Таким образом, если функция A имеет ссылку на карту и передает это значение функции B, которая возвращает int, ни одна функция B не может повлиять на копию карты A. Если функции B разрешили тайно изменить копию карты А, это будет побочным эффектом. Побочные эффекты не допускаются.

Вам необходимо понимать, что у Haskell нет переменных , как вы понимаете их. Он имеет неизменные значения, ссылки на неизменяемые значения и функции (которые принимают входные данные и возвращают новые результаты). Функции не имеют переменных, которые являются в области для других функций, которые могут изменять эти переменные «на лету». Этого не может быть.

В качестве примечания не только код, который вы опубликовали, показывает, что вы не понимаете основы синтаксиса Haskell, заданный вами вопрос показывает, что вы не поняли основные характеристики Haskell как языка.Мало того, что эти фундаментальные вещи могут быть поняты до того, как они выучили какой-либо синтаксис, вам нужно знать, чтобы понять смысл синтаксиса.

Если у вас есть крайний срок, познакомьтесь с ним, используя инструмент, который вы понимаете. Затем пойдите, изучите Haskell правильно.

+0

> Вне монады IO никакая функция не может иметь побочных эффектов. Но это неправильно. Любая монадическая функция может иметь некоторые побочные эффекты в соответствии с монадой. «Переменные» могут быть изменены в монадах штата и ST. – user3974391

+1

@ user2894391 Нет, это не так. Монады по-прежнему свободны от побочных эффектов - за исключением, конечно, монады IO. – Cubic

+0

@ user2894391 Какие побочные эффекты имеют монады Maybe? Он либо содержит значение, либо Nothing. Если он содержит значение, вы можете его извлечь. Ничто, что происходит внутри монадического контекста Maybe, может иметь побочные эффекты. Монада IO имеет дополнительные ограничения, что означает, что никакое значение, генерируемое в монаде IO, не может быть извлечено - кроме одной другой монады. Таким образом, побочные эффекты ограничены в этом поле. – itsbruce

1

Кроме того, вы увидите, что

вставка на карте в функцию, которая возвращает только Integer

почти невозможно выразить. Да, вы технически может сделать это, как в

insert k v map `seq` 42  -- force an insert and throw away the result 

, но если вы думаете, что, к примеру:

let done = insert k v map in 42 

ничего не делает с картой, вы, вероятно, неправильно.

В любом случае, однако, оригинал map изменен.

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