문제

다음 기능을 작성했고 Winhugs를 사용하여 실행했습니다.

teneven =  [x | x <- [1..10], even x]

내 출력 :

Main> teneven
[2,4,6,8,10] :: [Integer] 
(63 reductions, 102 cells)

어쨌든 모든 감축을 인쇄 할 수 있습니까? 그래서 나는 Winhugs에서 일어나는 핵심 평가를 배울 수 있습니까?

도움이 되었습니까?

해결책

몇 가지 아이디어 :

  1. 디버그 명령 줄 옵션 ( :set +d Hongs에서)는 유익하지만 매우 장점이며 Haskell 구문의 감소를 보여주지 않습니다.

  2. 노력하다 모자 - 하스켈 트레이서. 방금 간단한 프로그램에서 시도해 보았는데 꽤 멋지다. 그래도 나는 창문에 있지 않으며, 그것을 실행하는 것이 얼마나 어려운지 모르겠습니다. 그것은 상당히 어려울 것입니다. 그것은 시원하고 본질적으로 당신이 원하는 것이기 때문에 부끄러운 일입니다. 실행되면 모자 에서이 정보와 같은 것을 얻을 수 있습니다.

    main = {IO}
    teneven = [2,4,6,8,10]
    _foldr (\..) [1,2,3,4,5,6,7,8, ...] [] = [2,4,6,8,10]
    (\..) 1 [2,4,6,8,10] = [2,4,6,8,10]
    (\..) 2 [4,6,8,10] = [2,4,6,8,10]
    (\..) 3 [4,6,8,10] = [4,6,8,10]
    (\..) 4 [6,8,10] = [4,6,8,10]
    (\..) 5 [6,8,10] = [6,8,10]
    (\..) 6 [8,10] = [6,8,10]
    (\..) 7 [8,10] = [8,10]
    (\..) 8 [10] = [8,10]
    (\..) 9 [10] = [10]
    (\..) 10 [] = [10]
    

    람다가 있습니다 even. 또한 원한다면 모자는 foldr 그리고 다른 내부 통화; 기본적으로 그렇게하지 않습니다.

다른 팁

여기에는 Debug.Trace 및 Hugs.Observe 사용의 몇 가지 예가 있습니다.

import Debug.Trace
fact :: Integer -> Integer
fact 0 = trace "fact 0 ->> 1" 1
fact n = trace ("fact " ++ show n) (n * fact (n-1))


import Hugs.Observe
fact :: Integer -> Integer
fact 0 = observe "fact 0" 1
fact n = observe "fact n" (n *  fact (n-1))

이것이 Winhungs를 사용하여 모든 감축을 인쇄하는 방법을 파악하는 데 도움이되기를 바랍니다.

날 믿어, 당신은 이런 식으로 가고 싶지 않습니다.

각각의 특정 사례에 사용 된 감소의 설정 (및 순서)은 특정 언어 구현에 따라 다릅니다 (Hugs는 한 가지 방법으로 GHCI를 수행 할 수 있습니다. 다른 방식으로 JHC 등).

Secd Machine과 같은 기능적 언어를 위해 컴파일러/통역사/바이러스 머신을 구현하는 일반적인 방법에 대해 더 잘 읽으십시오.

여러 링크 :

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top