76 votes

Haskell ou Standard ML pour les débutants?

Je vais être l'enseignement d'un bas-division des cours dans des structures discrètes. J'ai sélectionné le texte du livre des Structures Discrètes, la Logique et la Compilation en partie parce qu'il contient des exemples et des concepts qui sont propices à la mise en œuvre avec un langage de programmation fonctionnel. (Je pense aussi que c'est un bon livre.)

Je veux un facile-à-comprendre la langue FP pour illustrer DS concepts et que les étudiants peuvent utiliser. La plupart des élèves n'ont eu qu'un ou deux semestres de la programmation en Java, au mieux. Après en regardant le Schéma, Erlang, Haskell, Ocaml, et SML, je l'ai réglé sur Haskell ou de Standard ML. Je suis penchée vers Haskell pour les raisons exposées ci-dessous, mais j'aimerais l'avis de ceux qui sont actifs programmeurs dans l'un ou l'autre.

  • Les deux Haskell et le SML ont filtrage qui permet de décrire un algorithme récursif un jeu d'enfant.
  • Haskell a de belles interprétations de la liste qui correspondent bien avec la façon dont ces listes sont exprimées mathématiquement.
  • Haskell a évaluation différée. Idéal pour la construction de l'infini des listes à l'aide de la liste de compréhension de la technique.
  • SML a une réelle interprète dans les fonctions qui peuvent être à la fois défini et utilisé. En Haskell, les fonctions doivent être définies dans un fichier séparé et compilé avant d'être utilisés dans le shell interactif.
  • SML donne une confirmation explicite de l'argument de fonction et types de retour dans une syntaxe qui est facile à comprendre. Par exemple: val foo = fn : int * int -> int. Haskell implicite de curry, la syntaxe est un peu plus obtus, mais pas totalement étranger. Par exemple: foo :: Int -> Int -> Int.
  • Haskell utilise en précision arbitraire entiers par défaut. C'est une bibliothèque externe en SML/NJ. Et SML/NJ tronque de sortie de 70 caractères par défaut.
  • Haskell lambda syntaxe est subtile -- il utilise une seule barre oblique inverse. SML est plus explicite. Vous ne savez pas si nous allons jamais besoin lambda dans cette classe, bien que.

Essentiellement, SML et Haskell sont à peu près équivalentes. Je me penche vers Haskell parce que je suis amoureuse de la liste des inclusions et infini listes en Haskell. Mais je suis inquiet que le grand nombre de symboles dans Haskell syntaxe compacte peut causer des étudiants de problèmes. De ce que j'ai recueillies en lisant d'autres posts, Haskell n'est pas recommandé pour les débutants de commencer avec FP. Mais nous n'allons pas être en bâtiment à part entière, il suffit de seulement essayer des algorithmes simples.

Qu'en pensez-vous?


Edit: À la lecture de certains de vos excellentes réponses, je me dois de préciser certains de mes points de balle.

En SML, il n'y a pas de distinction syntaxique entre la définition d'une fonction dans l'interpréteur et le définir dans un fichier externe. Disons que vous voulez écrire la fonction factorielle. En Haskell, vous pouvez mettre cette définition dans un fichier et le charger dans GHCi:

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

Pour moi, c'est clair, succinct et correspond à la définition mathématique dans le livre. Mais si vous voulez écrire la fonction dans GHCi directement, vous devez utiliser une syntaxe différente:

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

Lorsque vous travaillez avec interactive interprètes, à partir d'un point de vue enseignement, c'est très, très pratique lorsque l'étudiant peut utiliser le même code dans un fichier et la ligne de commande.

Par "confirmation explicite de la fonction," je voulais dire que, lors de la définition de la fonction, SML tout de suite vous indique le nom de la fonction, les types d'arguments et le type de retour. En Haskell, vous devez utiliser l' :type de commande, puis vous obtenez quelque peu déroutant au curry notation.

Une chose de plus cool sur Haskell--c'est là une définition de la fonction:

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

Encore une fois, cela correspond à une définition ils peuvent trouver dans le manuel. Ne pouvez pas le faire en SML!

86voto

Norman Ramsey Points 115730

Autant j'adore les Haskell, voici les raisons pour lesquelles je préfère SML pour une classe dans les mathématiques discrètes et structures de données (et la plupart des autres cours d'initiation):

  • Le temps et l'espace des coûts des programmes Haskell peut être très difficile à prévoir, même pour les experts. SML offre beaucoup plus limitée, à faire exploser la machine.

  • La syntaxe de la fonction définition interactif interprète est identique à la syntaxe utilisée dans un fichier, de sorte que vous pouvez couper et coller.

  • Bien que la surcharge d'opérateur en SML est totalement faux, c'est aussi simple. Ça va être dur d'enseigner à une classe entière, en Haskell, sans avoir à entrer dans les classes de type.

  • L'étudiant peut déboguer à l'aide d' print.

  • Infini de structures de données souffler l'esprit des gens. Pour les débutants, vous êtes mieux d'avoir à définir un type de flux de données complète avec les ref des cellules et des thunks, afin qu'ils sachent comment cela fonctionne:

    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
    

    Maintenant, c'est pas de la magie, pas plus, et vous pouvez aller à partir d'ici pour les cours d'eau (infini des listes).

  • Mise en page n'est pas aussi simple qu'en Python et peut être source de confusion.

Il y a deux endroits Haskell a un avantage:

  • Dans le noyau de Haskell vous pouvez écrire une fonction de signature de type juste avant sa définition. Ceci est extrêmement utile pour les étudiants et les autres débutants. Il n'est tout simplement pas une belle façon de traiter avec la signature type de SML.

  • Haskell a une meilleure syntaxe concrète. Le Haskell syntaxe est une amélioration majeure par rapport à ML syntaxe. J'ai écrit une brève remarque sur l'utilisation des parenthèses dans un ML de programme; cela aide un peu.

Enfin, il y a une épée à deux tranchants:

  • Code Haskell est un pur par défaut, de sorte que vos élèves est rare de tomber sur impur constructions (IO monade, l'état de monade) par accident. Mais, en même temps, ils ne pouvez pas imprimer, et si vous voulez faire des I/O, puis au minumum de vous expliquer do de la notation, et return est source de confusion.


Sur un sujet connexe, voici quelques conseils pour vos cours de préparation: il ne faut pas négliger Purement Fonctionnelle des Structures de Données par Chris Okasaki. Même si vous n'avez pas vos élèves l'utilisent, vous aurez certainement envie d'en avoir une copie.

29voto

nominolo Points 3895

Nous enseignons Haskell aux premières années de notre université. Mes sentiments à ce sujet sont un peu mélangés. D'une part, l'enseignement Haskell premières années signifie qu'ils n'ont pas à désapprendre l'impératif de style. Haskell peut également produire du code concis qui les gens qui ont un peu de Java avant de pouvoir l'apprécier.

Certains des problèmes que j'ai constaté que les élèves ont souvent de:

  • La correspondance de motif peut être un peu difficile, au premier abord. Les étudiants d'abord eu quelques difficultés à voir la façon dont la valeur de la construction et de filtrage sont liées. Ils ont aussi eu quelques problèmes de distinction entre les abstractions. Nos exercices inclus l'écriture de fonctions qui simplifient l'expression arithmétique et certains élèves ont de la difficulté à voir la différence entre la représentation abstraite (par exemple, Const 1) et le méta-langage de représentation (1).

    En outre, si vos élèves sont censés écrire la liste des fonctions de traitement d'elles-mêmes, être prudent, en soulignant la différence entre les modèles

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

    Selon combien de programmation fonctionnelle, vous voulez leur apprendre sur le chemin, vous pouvez juste leur donner quelques fonctions de la bibliothèque et de les laisser jouer avec.

  • Nous n'avons pas d'enseigner à nos élèves sur les fonctions anonymes, nous avons simplement parlé where clauses. Pour certaines tâches, c'était un peu verbeux, mais bien fonctionné autrement. Nous ne leur disons pas sur les applications partielles; c'est sans doute assez facile à expliquer en Haskell (en raison de sa forme d'écriture types) de sorte qu'il pourrait être intéressant de montrer à eux.

  • Ils ont rapidement découvert interprétations de la liste et qu'il les préférait plus de fonctions d'ordre supérieur, comme filter, map, zipWith.

  • Je pense que nous avons manqué un peu de leur enseigner comment laisser guider leurs pensées par les types. Je ne suis pas tout à fait sûr, cependant, si c'est utile pour les débutants ou non.

  • Les messages d'erreur sont généralement pas très utile pour les débutants, ils peuvent parfois avoir besoin de l'aide avec ces. Je n'ai pas essayé moi-même, mais il y a un compilateur Haskell spécifiquement ciblées sur les nouveaux arrivants, principalement par le moyen de mieux les messages d'erreur: l'Hélium

  • Pour les petits programmes, des choses comme espace possible les fuites n'étaient pas un problème.

Dans l'ensemble, Haskell est un bon enseignement de la langue, mais il y a quelques pièges. Étant donné que les élèves se sentent beaucoup plus à l'aise avec les interprétations de la liste de fonctions d'ordre supérieur, c'est peut être l'argument dont vous avez besoin. Je ne sais pas combien de temps votre cours est ou combien de programmation que vous voulez leur enseigner, mais ne prévoyez un peu de temps pour leur enseigner les concepts de base--ils en auront besoin.

13voto

Don Stewart Points 94361

BTW,

# SML a véritablement interactif interprète dans les fonctions qui peuvent être à la fois défini et utilisé. En Haskell, les fonctions doivent être définies dans un fichier séparé et compilé avant utilisé dans le shell interactif.

Est inexacte. Utilisation GHCi:

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

Il y a aussi de bonnes ressources pour Haskell dans l'éducation sur le haskell.org edu. page, avec des expériences auprès de différents professeurs. http://haskell.org/haskellwiki/Haskell_in_education

Enfin, vous serez en mesure de leur enseigner multicœur parallélisme juste pour le fun, si vous utilisez Haskell :-)

11voto

Ganesh Sittampalam Points 17695

De nombreuses universités enseignent Haskell dans un premier langage fonctionnel ou même d'un premier langage de programmation, donc je ne pense pas que ce sera un problème.

Ayant fait partie de l'enseignement sur l'un de ces cours, je ne pense pas que les possibles confusions de vous identifier sont que probables. Les sources les plus probables de début de la confusion sont l'analyse des erreurs causées par une mauvaise mise en page, et de mystérieux messages sur les classes de type lorsque les littéraux numériques sont utilisés de manière incorrecte.

Je voudrais aussi en désaccord avec la suggestion que Haskell n'est pas recommandé pour les débutants de commencer avec FP. C'est certainement l'approche big bang dans les moyens que le strict langues avec la mutation ne le sont pas, mais je pense que c'est une approche valable.

9voto

ephemient Points 87003
  • SML a une réelle interprète dans les fonctions qui peuvent être à la fois défini et utilisé. En Haskell, les fonctions doivent être définies dans un fichier séparé et compilé avant d'être utilisés dans le shell interactif.

Alors que les Câlins peuvent avoir cette limitation, GHCi ne pas:

$ 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"

Il y a de nombreuses raisons pour lesquelles je préfère GHC(i) plus de Câlins, c'est juste l'un d'eux.

  • SML donne une confirmation explicite de l'argument de fonction et types de retour dans une syntaxe qui est facile à comprendre. Par exemple: val foo = fn : int * int -> int. Haskell implicite de curry, la syntaxe est un peu plus obtus, mais pas totalement étranger. Par exemple: foo :: Int -> Int -> Int.

SML a ce que vous appelez "implicite curry" syntaxe.

$ 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

Essentiellement, SML et Haskell sont à peu près équivalentes. Je me penche vers Haskell parce que je suis amoureuse de la liste des inclusions et infini listes en Haskell. Mais je suis inquiet que le grand nombre de symboles dans Haskell syntaxe compacte peut causer des étudiants de problèmes. De ce que j'ai recueillies en lisant d'autres posts, Haskell n'est pas recommandé pour les débutants de commencer avec FP. Mais nous n'allons pas être en bâtiment à part entière, il suffit de seulement essayer des algorithmes simples.

J'ai comme l'utilisation de Haskell beaucoup plus de SML, mais je serais encore enseigner SML en premier.

  • Détachant nominolo les pensées, les interprétations de la liste ne semblent ralentir les étudiants d'accéder à certaines fonctions d'ordre supérieur.
  • Si vous voulez la paresse et à l'infini des listes, il est instructif de mettre en œuvre de manière explicite.
  • Parce que SML est avec impatience évalué, le modèle d'exécution est beaucoup plus facile à comprendre, et de "débogage via printf" fonctionne beaucoup mieux qu'en Haskell.
  • SML du type de système est également plus simple. Alors que votre classe n'y aurait probablement pas de les utiliser de toute façon, Haskell typeclasses sont encore un supplément de bosse pour obtenir des sur-de les amener à comprendre l' 'a contre ''a distinction dans le SML est assez difficile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X