Оценка неопределенных элементов в типах данных Haskell - PullRequest
0 голосов
/ 25 июня 2011

, если я пытаюсь > fst(a, b), где a, b не определены, я получаю сообщение об ошибке, что b не определено.Даже при попытке snd(a, b) сначала возникает ошибка b.У меня есть опыт в императивном программировании.Мне интересно, если это какая-то лень, которую я не понимаю.

Ответы [ 3 ]

5 голосов
/ 25 июня 2011

Я думаю, что комментарий FUZxxl абсолютно правильный.Когда я вписываю в реплик Хагса:

Hugs> fst(a,b)
ERROR - Undefined variable "b"
Hugs> snd(a,b)
ERROR - Undefined variable "b"

Это не ленивая / энергичная оценка - когда Хагс проверяет, что fst(a,b) является действительным кодом Haskell, он замечает, что aи b не определены.Эти две буквы не имеют специального значения в Haskell, они переменные, как и в любом другом языке!

Это похоже на движение Java:

System.out.println(a);

И никогда не говорить, что aявляется!Вместо этого вы должны написать что-то вроде:

String a = "Hello world."
System.out.println(a);

Чтобы исправить это, вы можете определить a и b в выражении let , например:

>let (a,b) = (1,2) in fst(a,b) 

или

>let tup = (1,2) in fst tup

или

>let a=1;b=2 in fst(a,b)

или , где оператор

>fst(a,b) where a=1;b=2

и т. Д.

В качестве альтернативы, определите в каком-нибудь файле, который называется «что угодно» (например, «TestTuple.hs»)

a = 1
b = 2

и в Hugs, перейдите:

>:load TestTuple.hs
>fst(a,b)
1

Хотя вы заметили, чтоВы используете Hugs, просто для справки, в GHCi , вы также можете определить переменные в REPL следующим образом:

>let a = 1
>let b = 2
>fst(a,b)
 1
>snd(a,b)
 2
1 голос
/ 25 июня 2011

Вот что вы увидите:

Prelude> fst (undefined, undefined)
*** Exception: Prelude.undefined
Prelude> snd (undefined, undefined)
*** Exception: Prelude.undefined

Как видите, доступ к неопределенному элементу приводит к неопределенному значению.

Лень позволяет нам не оценивать всю структуру, однако

Prelude> snd (undefined, 2)
2

Ваш комментарий предполагает, что вы могли забыть объявить некоторые конкретные переменные, a и b.

0 голосов
/ 22 июля 2011

Я думаю, что ваш вопрос был в том, почему он жалуется на b, а не на a, и это потому, что haskell оценивает аргументы произвольно. То есть вы никогда не знаете, какой из них оценивается первым. В вашем случае, очевидно, haskell оценил b раньше, чем случайно, и поэтому жалуется на b, но не на a.

...