Hugs에 들어있는 top-level인 hugs는 프롬프트 상에서 직접 정의를 바인딩할 수 없으며, global 스코프에 대한 let 바인딩도 안됩니다:
Hugs.Base> x = 3
ERROR - Syntax error in input (unexpected `=')
Hugs.Base> let x = 3
ERROR - Syntax error in expression (unexpected end of input)
Hugs.Base>
따라서 Hugs를 쓰실 때에는 소스 코드 파일(*.hs)을 작성해서 :l 명령으로 로드하셔야 합니다.
물론 Hugs에서도 다음과 같은 let 표현식이나 where 절은 프롬프트 상에서 직접 평가할 수 있고, 이때의 임시 정의들은 당연히 local 바인딩입니다:
Hugs.Base> x + 5 where x = 3
8 :: Integer
Hugs.Base> let x = 10 in x + 5
15 :: Integer
Hugs.Base>
PS: Hugs의 top-level인 hugs와는 달리, GHC에 들어있는 top-level인 ghci에서는 (제한적이나마) global 스코프에 대한 let 바인딩이 가능하긴 합니다:
Prelude> let x = [1,2,3]
Prelude> head x
1
Prelude> let fact n = if n <= 1 then 1 else n * fact (n - 1)
Prelude> fact 30
265252859812191058636308480000000
Prelude>
심지어 re-binding까지 가능합니다 (GHC 계열 전체의 언어적 변형은 아니고 단지 ghci 평가기만의 확장 기능인 것으로 보입니다):
Prelude> let x = "abc"
Prelude> head x
'a'
Prelude>
이런 re-binding 때문에 얼핏 정의(definition)가 아닌 대입(assignment)인 것으로 오해할 수도 있지만, 여전히 대입은 아니고 정의입니다:
Prelude> let x = '.' : x
Prelude> take 10 x
".........."
Prelude>
(만일 일반적인 대입의 개념이었다면 마지막 take 10 x의 결과는 ".abc"였겠죠.)
-- 자본주의, 자유민주주의 사회에서는 결국 자유마저 돈으로 사야하나보다.
사줄테니 제발 팔기나 해다오. 아직 내가 "사겠다"고 말하는 동안에 말이다!
다름이 아니라 추가 질문입니다;
haskell 관련 좀 보기 쉬운 문서는 없나요?
예를 들면, 한글화 된거라든가...
책으로 얇게 출간된 거라든가..
어떤 걸 보고 계신지 궁금합니다.
순수함수형언어에서 굳이 Haskell이 아니라면 Clean도 고려 해볼만 합니다.
두 언어가 문법이 많이 비슷합니다. 물론 세부적인 면에서는 차이 가 있겠지만요.....
Clean이 Haskell보다는 더 빠르고 작은 코드를 생성해 냅니다.
Clean을 배워보라고 하는이유는 입문자가 접근하기에 대단히 유용한 Clean book이라는 좋은 온라인문서 때문입니다.
이만한 문서를 다른어디에서 찾기는 쉽지 않을것 같다는 생각이 드는군요.
참고로 3n+1이라는 문제가 나오길래 functional.or.kr에나오는
Haskell코드를 Clean으로 코딩해봤읍니다.
heil :: Int -> [Int]
heil n
| n == 1 = [1]
| isEven n = [n :heil (n / 2)]
= [n :heil (n * 3 + 1)]
fun :: ([Int] -> Int)
fun = foldl (\s e = let s` = (length o heil) e in if (s > s`) s s`) 0
Start = fun [1..100000]
Haskell코드와 거의 흡사합니다.
제가 생각하기에는 순수함수형언어가 왜 배워볼만한지를 보여주는
간단하지만 직관적이고 단순한 예라는 생각이 드는군요.
그래서 흥미를 위해 약간의 설명을 보탭니다.
처음 순수함수형언어를 접하시는 분이라면 다음과 같은 코드를 보고 기겁을 하실지도 모르겠군요
length [1..100000000]
말그대로 리스트의 길이를 결정합니다. 물론 결과는 100000000입니다.
Clean에서 위코드를 실행시키면 제 컴퓨터에서 거의 2~3초내에 결과를 보여줍니다. 물론 컴파일옵션에서 힙관련 메모리크기를 1킬로바이트로 조정해도 프로그램의 동작에는 아무 문제가 없읍니다.
즉 전체리스트를 만들고 이전체를 length로 넘기는게 아니라는거죠. 필요할때 만들고 그리고 length에서 카운트합니다. 또 카운트된 리스트의 요소는 메모리를 점유하지 않고 사라집니다. 그리고 다음리스트의 요소가 만들어지고 length로 넘어가고 카운트되고
사라지고 다음요소가 만들어지고 넘어가고 계속이런식입니다.
위의 fun함수도 마찬가지입니다. 첫번째 요소 1결정되고 foldl에 넘어가고 heil에서 관련된수의 리스트를 만들어 냅니다.
이때도 모든리스트가 결정되는게 아니라 첫번째 요소를 결정하고
length함수로 넘겨지고 length에서 카운트하고 다시 heil에서 다음요소를 결정하고... 물론 이때도 heil에서 이미 length넘겨 카운트된 요소는 사라집니다.
모든리스트의 길이가 결정되면 foldl에 인자로 넘겨진 함수에의해
최대길이를 결정합니다. 그리고 다시 2라는 요소가 foldl에 넘겨지고 하는식입니다. foldl, heil, length 이모든것이 fun에 넘겨진 리스트의 각각의 요소에 대해서 순차적으로 작동합니다.
물론 그각각의 요소는 필요할때 결정됩니다.
그래서 간결하지만 대단히 직관적이고도 단순한 코드를 만들수 있읍니다. 물론 실행속도도 꽤 빠릅니다.
참고로 Clean에서는 Strict리스트라는 것을 만들수도 있읍니다.
heil이라는 게 어떤 함수일 지는 잘 모르겠습니다만,heil :
heil이라는 게 어떤 함수일 지는 잘 모르겠습니다만,
heil :: Integer -> [Integer]
일 것이라고 상상해 봅니다.
인터프리터에서는 저렇게 해서 함수 정의를 하기가 힘들지요.
그냥 적당한 소스 (가령 Heil.hs) 로 만들어서 로딩하는 게 낫겠습니다만...
e.g.
이 함수는 그냥 엉뚱한 상상입니다. ^^ 제가 아는 한에서 heil 이라는 함수는 표준 라이브러리에 없는 것으로 기억합니다.
이런 것을 로딩하고 heil 1 을 evaluate하면 [1] 이 나오겠지요. :)
오병현 배상
Hugs에 들어있는 top-level인 hugs는 프롬프트 상에서 직접
Hugs에 들어있는 top-level인 hugs는 프롬프트 상에서 직접 정의를 바인딩할 수 없으며, global 스코프에 대한 let 바인딩도 안됩니다:
따라서 Hugs를 쓰실 때에는 소스 코드 파일(*.hs)을 작성해서 :l 명령으로 로드하셔야 합니다.
물론 Hugs에서도 다음과 같은 let 표현식이나 where 절은 프롬프트 상에서 직접 평가할 수 있고, 이때의 임시 정의들은 당연히 local 바인딩입니다:
아마도 Make It Functional 사이트 블로그의 3n + 1 문제를 실습해보시려는 것 같군요. 저도 재미있게 읽고 있습니다. :)
PS: Hugs의 top-level인 hugs와는 달리, GHC에 들어있는 top-level인 ghci에서는 (제한적이나마) global 스코프에 대한 let 바인딩이 가능하긴 합니다:
심지어 re-binding까지 가능합니다 (GHC 계열 전체의 언어적 변형은 아니고 단지 ghci 평가기만의 확장 기능인 것으로 보입니다):
이런 re-binding 때문에 얼핏 정의(definition)가 아닌 대입(assignment)인 것으로 오해할 수도 있지만, 여전히 대입은 아니고 정의입니다:
(만일 일반적인 대입의 개념이었다면 마지막 take 10 x의 결과는 ".abc"였겠죠.)
--
자본주의, 자유민주주의 사회에서는 결국 자유마저 돈으로 사야하나보다.
사줄테니 제발 팔기나 해다오. 아직 내가 "사겠다"고 말하는 동안에 말이다!
Haskell 공부하시나봅니다..저도 예전부터 한번 해보고 싶은데
Haskell 공부하시나봅니다..
저도 예전부터 한번 해보고 싶은데
시간이 없어서...;
다름이 아니라 추가 질문입니다;
haskell 관련 좀 보기 쉬운 문서는 없나요?
예를 들면, 한글화 된거라든가...
책으로 얇게 출간된 거라든가..
어떤 걸 보고 계신지 궁금합니다.
일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.
제 블로그에 올라온 [url=http://functional.or.kr/
제 블로그에 올라온 Haskell 연습: 3n+1 문제 때문인 듯 합니다. 다른 분들의 설명대로 hugs는 인터프리터 상에서 함수를 정의할 수 없습니다. ^^
hugs 사용법에 대해선 http://functional.or.kr/blog/hugs-usage을 참고하시기 바랍니다.
그리고 쌀밥님, 한국어로 된 알기 쉬운 Haskell 초급 입문서로는 http://functional.or.kr이 좋고 (쿨럭), 다 보신 다음에는 차리서님께서 번역하신 A Gentle Introduction to Haskell
한국어판을 읽어보시면 될 듯 합니다. ^^
http://mentalese.net
http://functional.or.kr
[quote="쌀밥"]Haskell 공부하시나봅니다..저도 예전부터
순수함수형언어에서 굳이 Haskell이 아니라면 Clean도 고려 해볼만 합니다.
두 언어가 문법이 많이 비슷합니다. 물론 세부적인 면에서는 차이 가 있겠지만요.....
Clean이 Haskell보다는 더 빠르고 작은 코드를 생성해 냅니다.
Clean을 배워보라고 하는이유는 입문자가 접근하기에 대단히 유용한 Clean book이라는 좋은 온라인문서 때문입니다.
이만한 문서를 다른어디에서 찾기는 쉽지 않을것 같다는 생각이 드는군요.
참고로 3n+1이라는 문제가 나오길래 functional.or.kr에나오는
Haskell코드를 Clean으로 코딩해봤읍니다.
heil :: Int -> [Int]
heil n
| n == 1 = [1]
| isEven n = [n :heil (n / 2)]
= [n :heil (n * 3 + 1)]
fun :: ([Int] -> Int)
fun = foldl (\s e = let s` = (length o heil) e in if (s > s`) s s`) 0
Start = fun [1..100000]
Haskell코드와 거의 흡사합니다.
제가 생각하기에는 순수함수형언어가 왜 배워볼만한지를 보여주는
간단하지만 직관적이고 단순한 예라는 생각이 드는군요.
그래서 흥미를 위해 약간의 설명을 보탭니다.
처음 순수함수형언어를 접하시는 분이라면 다음과 같은 코드를 보고 기겁을 하실지도 모르겠군요
length [1..100000000]
말그대로 리스트의 길이를 결정합니다. 물론 결과는 100000000입니다.
Clean에서 위코드를 실행시키면 제 컴퓨터에서 거의 2~3초내에 결과를 보여줍니다. 물론 컴파일옵션에서 힙관련 메모리크기를 1킬로바이트로 조정해도 프로그램의 동작에는 아무 문제가 없읍니다.
즉 전체리스트를 만들고 이전체를 length로 넘기는게 아니라는거죠. 필요할때 만들고 그리고 length에서 카운트합니다. 또 카운트된 리스트의 요소는 메모리를 점유하지 않고 사라집니다. 그리고 다음리스트의 요소가 만들어지고 length로 넘어가고 카운트되고
사라지고 다음요소가 만들어지고 넘어가고 계속이런식입니다.
위의 fun함수도 마찬가지입니다. 첫번째 요소 1결정되고 foldl에 넘어가고 heil에서 관련된수의 리스트를 만들어 냅니다.
이때도 모든리스트가 결정되는게 아니라 첫번째 요소를 결정하고
length함수로 넘겨지고 length에서 카운트하고 다시 heil에서 다음요소를 결정하고... 물론 이때도 heil에서 이미 length넘겨 카운트된 요소는 사라집니다.
모든리스트의 길이가 결정되면 foldl에 인자로 넘겨진 함수에의해
최대길이를 결정합니다. 그리고 다시 2라는 요소가 foldl에 넘겨지고 하는식입니다. foldl, heil, length 이모든것이 fun에 넘겨진 리스트의 각각의 요소에 대해서 순차적으로 작동합니다.
물론 그각각의 요소는 필요할때 결정됩니다.
그래서 간결하지만 대단히 직관적이고도 단순한 코드를 만들수 있읍니다. 물론 실행속도도 꽤 빠릅니다.
참고로 Clean에서는 Strict리스트라는 것을 만들수도 있읍니다.
length [!1..100000000!]
이경우는 마찬가지로 생각하시는 그대로입니다. 힙사이즈를 수백메가로 늘려도 실행시에 메모리부족 에러가 나옵니다.
재미있지 않나요 ^^;
댓글 달기