문제

나는 개별 구조에서 저하 과정을 가르 칠 것입니다. 교과서를 선택했습니다 개별 구조, 논리 및 계산 성 부분적으로는 기능적 프로그래밍 언어로 구현에 도움이되는 예와 개념이 포함되어 있기 때문입니다. (나는 또한 좋은 교과서라고 생각합니다.)

DS 개념을 설명하고 학생들이 사용할 수있는 FP 언어를 이해하기 쉬운 FP 언어를 원합니다. 대부분의 학생들은 Java에서 한 학기 또는 2 학기의 프로그래밍을 가졌을 것입니다. Scheme, Erlang, Haskell, Ocaml 및 SML을 살펴본 후 Haskell 또는 Standard ML에 정착했습니다. 나는 아래에 요약 된 이유 때문에 Haskell에 기대고 있지만, 다른 하나 또는 다른 프로그램에서 활발한 프로그래머 인 사람들의 의견을 원합니다.

  • Haskell과 SML은 모두 패턴 매칭을 가지고있어 재귀 알고리즘을 묘사합니다.
  • Haskell은 그러한 목록이 수학적으로 표현되는 방식과 잘 어울리는 멋진 목록 이해력을 가지고 있습니다.
  • Haskell은 게으른 평가를 받았습니다. 목록 이해 기술을 사용하여 무한 목록을 구성하는 데 적합합니다.
  • SML에는 기능이 정의되고 사용할 수있는 진정한 대화식 통역사가 있습니다. Haskell에서는 기능을 별도의 파일로 정의하고 대화식 쉘에서 사용하기 전에 컴파일해야합니다.
  • SML은 이해하기 쉬운 구문에서 함수 인수 및 반환 유형을 명시 적으로 확인합니다. 예를 들어 : val foo = fn : int * int-> int. Haskell의 암시적인 카레 구문은 조금 더 둔하지만 완전히 외계인은 아닙니다. 예 : foo :: int-> int-> int.
  • Haskell은 기본적으로 임의의 정수 정수를 사용합니다. SML/NJ의 외부 라이브러리입니다. SML/NJ는 기본적으로 출력을 70 자로 자릅니다.
  • Haskell의 Lambda 구문은 미묘합니다. 단일 백 슬래시를 사용합니다. SML이 더 명백합니다. 하지만이 수업에서 람다가 필요할지 확실하지 않습니다.

본질적으로 SML과 Haskell은 거의 동일합니다. 나는 Haskell의 목록 이해와 무한한 목록을 좋아하기 때문에 Haskell에 기대어 있습니다. 그러나 Haskell의 소형 구문에 광범위한 상징이 학생들의 문제를 일으킬 수 있다고 걱정합니다. 내가 수집 한 것에서 다른 게시물을 읽은 내용에서 Haskell은 FP로 시작하는 초보자에게 권장되지 않습니다. 그러나 우리는 본격적인 응용 프로그램을 구축하지 않고 간단한 알고리즘을 시도하지 않을 것입니다.

어떻게 생각해?


편집 : 당신의 위대한 응답 중 일부를 읽었을 때, 나는 내 총알 포인트 중 일부를 명확히해야합니다.

SML에서는 통역사의 함수를 정의하고 외부 파일에서 정의하는 것 사이의 구문 적 구분이 없습니다. 계승 기능을 작성하고 싶다고 가정 해 봅시다. Haskell에서는이 정의를 파일에 넣고 GHCI로로드 할 수 있습니다.

fac 0 = 1
fac n = n * fac (n-1)

나에게 그것은 명확하고 간결하며 책의 수학적 정의와 일치합니다. 그러나 GHCI에 기능을 직접 작성하려면 다른 구문을 사용해야합니다.

let fac 0 = 1; fac n = n * fac (n-1)

대화식 통역사와 함께 작업 할 때 교수 관점에서 학생이 파일과 명령 줄 모두에서 동일한 코드를 사용할 수있을 때 매우 편리합니다.

"함수의 명시 적 확인"에 의해, 나는 함수를 정의 할 때 SML이 즉시 함수의 이름, 인수 유형 및 반환 유형을 알려줍니다. Haskell에서는 사용해야합니다 :type 명령 한 다음 다소 혼란스러운 카레 표기법을 얻습니다.

Haskell에 대한 또 다른 멋진 점 - 이것은 유효한 기능 정의입니다.

fac 0 = 1
fac (n+1) = (n+1) * fac n

다시 말하지만, 이것은 교과서에서 찾을 수있는 정의와 일치합니다. SML에서는 할 수 없습니다!

도움이 되었습니까?

해결책

내가 Haskell을 좋아하는 것처럼, 여기에 내가 이산 수학 및 데이터 구조 (및 대부분의 다른 초보자 수업)에서 SML을 선호하는 이유는 다음과 같습니다.

  • Haskell 프로그램의 시간과 공간 비용은 전문가에게도 예측하기가 매우 어려울 수 있습니다. SML은 기계를 날려 버릴 수있는 훨씬 더 제한된 방법을 제공합니다.

  • 대화식 통역사의 함수 정의에 대한 구문 동일한 파일에 사용 된 구문으로 자르고 붙여 넣을 수 있습니다.

  • SML에서 작업자 과부하는 완전히 가짜이지만 간단합니다. 유형 수업에 들어 가지 않고도 Haskell에서 전체 수업을 가르치기가 어려울 것입니다.

  • 학생은 사용을 디버그 할 수 있습니다 print. (논평자가 지적했듯이 Haskell에서 거의 동일한 효과를 얻을 수 있지만 Debug.Trace.trace.)

  • 무한한 데이터 구조는 사람들의 마음을 날려 버립니다. 초보자에게는 심판 셀과 펑크로 완성 된 스트림 유형을 정의하는 것이 좋습니다.

    datatype 'a thunk_contents = UNEVALUATED of unit -> 'a
                               | VALUE of 'a
    type 'a thunk = 'a thunk_contents ref
    val delay : (unit -> 'a) -> 'a thunk
    val force : 'a thunk -> 'a
    

    이제는 더 이상 마법이 아니며 여기에서 스트림 (Infinite Lists)으로 갈 수 있습니다.

  • 레이아웃은 파이썬에서만큼 간단하지 않으며 혼란 스러울 수 있습니다.

Haskell이 가장자리가있는 두 곳이 있습니다.

  • Core Haskell에서는 정의 직전에 함수 유형 서명을 작성할 수 있습니다. 이것은 학생과 다른 초보자에게 큰 도움이됩니다. SML에서 유형 서명을 다루는 좋은 방법은 없습니다.

  • Haskell은 더 나은 콘크리트 구문을 가지고 있습니다. Haskell Syntax는 ML 구문보다 큰 개선입니다. 나는 a ML 프로그램에서 괄호를 사용하는시기에 대한 짧은 메모; 이것은 조금 도움이됩니다.

마지막으로, 두 가지 방법을 모두 자르는 칼이 있습니다.

  • Haskell Code는 기본적으로 순수하므로 학생들은 우연히 불순한 구조물 (IO Monad, State Monad)을 우연히 발견하지 못할 것입니다. 그러나 같은 토큰으로 인쇄 할 수 없으며 I/O를하고 싶다면 Minumum에서 설명해야합니다. do 표기법 및 return 혼란 스럽습니다.

관련 주제에 대해서는 다음 과정 준비에 대한 조언이 있습니다. 간과하지 마십시오. 순전히 기능적인 데이터 구조 Chris Okasaki에 의해. 학생들이 사용하지 않더라도 사본을 갖고 싶을 것입니다.

다른 팁

우리는 대학에서 1 년 동안 Haskell을 가르칩니다. 이것에 대한 나의 감정은 약간 혼합되어 있습니다. 한편으로는 Haskell을 처음으로 가르치는 것은 명령적인 스타일을 꺼낼 필요가 없다는 것을 의미합니다. Haskell은 또한 Java를 가진 사람들이 전에 감사 할 수있는 매우 간결한 코드를 생산할 수 있습니다.

학생들이 자주 발견 한 몇 가지 문제는 다음과 같습니다.

  • 처음에는 패턴 매칭이 약간 어려울 수 있습니다. 학생들은 처음에 가치 구성과 패턴 매칭이 어떻게 관련되어 있는지를 보는 데 문제가있었습니다. 또한 추상화를 구별하는 몇 가지 문제가있었습니다. 우리의 연습에는 산술 표현을 단순화하는 작문 기능이 포함되었으며 일부 학생들은 추상 표현의 차이를 보는 데 어려움을 겪었습니다 (예 : Const 1) 및 메타 언어 표현 (1).

    또한 학생들이 목록 처리 기능 자체를 작성 해야하는 경우 패턴 간의 차이점을주의 깊게 지적하십시오.

    []
    [x]
    (x:xs)
    [x:xs]
    

    도중에 가르치고 싶은 기능적 프로그래밍의 양에 따라 몇 가지 라이브러리 기능을 제공하고 그와 함께 놀아 주실 수 있습니다.

  • 우리는 학생들에게 익명의 기능에 대해 가르치지 않았습니다. where 조항. 일부 작업의 경우 이것은 약간 장점 이었지만 그렇지 않으면 잘 작동했습니다. 우리는 또한 부분적 응용 프로그램에 대해 말하지 않았습니다. 이것은 아마도 Haskell (글쓰기 형식으로 인해)에서 설명하기가 매우 쉽기 때문에 보여줄 가치가 있습니다.

  • 그들은 신속하게 목록 이해를 발견하고 다음과 같은 고차 기능보다 선호했습니다. filter, map, zipWith.

  • 나는 우리가 그들에게 그들이 자신의 생각을 유형으로 인도하게하는 방법을 가르치는 것을 조금 놓쳤다 고 생각합니다. 그러나 이것이 초보자에게 도움이되는지 여부는 확실하지 않습니다.

  • 오류 메시지는 일반적으로 초보자에게는 그다지 도움이되지 않으므로 때때로 이에 대한 도움이 필요할 수 있습니다. 직접 시도하지는 않았지만 주로 더 나은 오류 메시지를 통해 새로 온 사람들을 대상으로하는 Haskell 컴파일러가 있습니다. 헬륨

  • 소규모 프로그램의 경우 가능한 공간 누출과 같은 것은 문제가되지 않았습니다.

전반적으로 Haskell은 좋은 교육 언어이지만 몇 가지 함정이 있습니다. 학생들이 고차 기능보다 목록 이해력에 훨씬 더 편한 느낌이 들기 때문에 이것이 필요한 주장 일 수 있습니다. 나는 당신의 과정이 얼마나 오래 걸리거나 얼마나 많은 프로그래밍을 가르치고 싶은지 모르겠지만, 그들에게 기본 개념을 가르치는 데 시간을 계획하고 있습니다.

btw,

# SML에는 기능이 정의되고 사용할 수있는 진정한 대화식 통역사가 있습니다. Haskell에서는 기능을 별도의 파일로 정의하고 대화식 쉘에서 사용하기 전에 컴파일해야합니다.

부정확합니다. GHCI 사용 :

Prelude> let f x = x ^ 2
Prelude> f 7
49
Prelude> f 2
4

Haskell.org Edu에는 교육에 Haskell에게 좋은 자원이 있습니다. 다른 교사의 경험이있는 페이지. http://haskell.org/haskellwiki/haskell_in_education

마지막으로, 당신은 Haskell을 사용한다면 재미를 위해 멀티 코어 병렬 처리를 가르 칠 수 있습니다 :-)

많은 대학들이 Haskell을 최초의 기능 언어 또는 심지어 첫 번째 프로그래밍 언어로 가르치기 때문에 이것이 문제가 될 것이라고 생각하지 않습니다.

그러한 과정에서 일부 가르침을 수행 한 후, 나는 당신이 식별 할 수있는 혼란이 그럴 가능성이 있다는 데 동의하지 않습니다. 초기 혼란의 가장 큰 원인은 나쁜 레이아웃으로 인한 구문 분석 오류이며, 숫자 리터럴이 잘못 사용될 때 유형 클래스에 대한 신비한 메시지입니다.

또한 FP로 시작하는 초보자에게는 Haskell이 권장되지 않는다는 제안에도 동의하지 않습니다. 그것은 돌연변이를 가진 엄격한 언어가 그렇지 않은 방식으로 빅뱅 접근 방식이지만, 그것이 매우 유효한 접근법이라고 생각합니다.

  • SML에는 기능이 정의되고 사용할 수있는 진정한 대화식 통역사가 있습니다. Haskell에서는 기능을 별도의 파일로 정의하고 대화식 쉘에서 사용하기 전에 컴파일해야합니다.

포옹은 그 제한을 가질 수 있지만 GHCI는 다음과 같습니다.

$ ghci
GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> let hello name = "Hello, " ++ name
Prelude> hello "Barry"
"Hello, Barry"

GHC (I)보다 포옹을 선호하는 데는 여러 가지 이유가 있습니다. 이것은 그중 하나 일뿐입니다.

  • SML은 이해하기 쉬운 구문에서 함수 인수 및 반환 유형을 명시 적으로 확인합니다. 예를 들어 : val foo = fn : int * int-> int. Haskell의 암시적인 카레 구문은 조금 더 둔하지만 완전히 외계인은 아닙니다. 예 : foo :: int-> int-> int.

SML에는 "암시적인 카레"구문도 있습니다.

$ sml
Standard ML of New Jersey v110.69 [built: Fri Mar 13 16:02:47 2009]
- fun add x y = x + y;
val add = fn : int -> int -> int

본질적으로 SML과 Haskell은 거의 동일합니다. 나는 Haskell의 목록 이해와 무한한 목록을 좋아하기 때문에 Haskell에 기대어 있습니다. 그러나 Haskell의 소형 구문에 광범위한 상징이 학생들의 문제를 일으킬 수 있다고 걱정합니다. 내가 수집 한 것에서 다른 게시물을 읽은 내용에서 Haskell은 FP로 시작하는 초보자에게 권장되지 않습니다. 그러나 우리는 본격적인 응용 프로그램을 구축하지 않고 간단한 알고리즘을 시도하지 않을 것입니다.

나는 SML보다 Haskell을 사용하는 것을 좋아하지만 여전히 SML을 먼저 가르 칠 것입니다.

  • 두 번째 노미 노로의 생각은 이해력을 나열합니다 하다 학생들이 몇 차원의 기능을하는 것을 늦추는 것 같습니다.
  • 게으름과 무한한 목록을 원한다면 명시 적으로 구현하는 것이 유익합니다.
  • SML이 간절히 평가되기 때문에 실행 모델은 이해하기 훨씬 쉽고 "Printf를 통한 디버깅"은 Haskell보다 훨씬 더 잘 작동합니다.
  • SML의 유형 시스템도 더 간단합니다. 당신의 수업은 어쨌든 그것들을 사용하지 않을 가능성이 있지만, Haskell의 타입 클래스는 여전히 극복하는 데 더 많은 충돌이 발생합니다. 'a ~ 대 ''a SML의 구별은 충분히 힘들다.

대부분의 답변은 기술적 이었지만 현재는 적어도 하나를 고려해야한다고 생각합니다. Haskell (OCAML)은 현재 더 넓은 범위에서 더 큰 커뮤니티를 사용하고 있습니다. 이익과 재미를 위해 작성된 라이브러리 및 응용 프로그램의 큰 데이터베이스도 있습니다. 해킹. 코스가 끝난 후 일부 학생들이 언어를 사용하고 나중에 다른 기능 언어 (표준 ML)를 시도하는 데 중요한 요소 일 수 있습니다.

그들이 당신의 많은 우려를 해결한다는 점을 감안할 때 OCAML과 F#을 고려하지 않는다는 것에 놀랐습니다. 확실히 괜찮고 도움이되는 개발 환경은 학습자에게 우선 순위가 높습니까? SML은 뒤쳐져 있고 F#은 그 점에서 다른 모든 FPL보다 앞서 있습니다.

또한 OCAML과 F# 모두 목록 이해력이 있습니다.

Haskell. Haskell을 사용하여 배운 것 때문에 CS의 Algos/Theory 수업에서 앞서 있습니다. 그것은 포괄적 인 언어이며, 많은 CS를 가르쳐 줄 것입니다. 그냥 사용하여.

그러나 SML은 배우기가 훨씬 쉽습니다. Haskell에는 게으른 평가 및 제어 구조와 같은 기능이있어 훨씬 강력하지만 가파른 학습 곡선의 비용이 필요합니다. SML에는 그러한 곡선이 없습니다.

즉, 대부분의 Haskell은 Ruby, OBJC 또는 Python과 같은 과학적/수학 언어가 덜한 것들을 배우고있었습니다.

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