Bonjour,

j'ai découvert ce langage au travers du post sur une intervention de Jedai (merci Maitre, oserais-je dire ... )

Du coup, j'ai décidé de faire un peu mumuse avec ...
Je suis parti de son exemple, et j'essai, d'une part de comprendre ce que je manipule , et d'autre part de compléter le source pour permettre l'appel de la fonction depuis l'extérieur.

la fonction que je veux appeler depuis l'extérieur est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
findBestBalance wsLeft wsRight = 
    if size i == 1 then Nothing else Just $ findMax i
        where i = sums wsLeft `intersection` sums wsRight
J'ai donc tenté de rajouter une ligne ressemblant à ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
foreign export ccall "haskellBalance" findBestBalance :: [Integer] [Integer]
pour dire que l'extérieur verra une fonction haskellBalance faisant référence à findBestBalance et prenant (si j'ai bien compris le truc) 2 listes d'Integer comme paramètre. Mais là, je pense que j'ai un problème de définition du "prototype de la fonction" (désolé, j'utilise un vocabulaire qui n'est peut être pas le bon pour le langage).

En effet, la tentative de compil (ghc -O2 -c balance.hs) me donne l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
balance.hs:10:19:
    Kind error: `[Integer]' is applied to too many type arguments
    In the type `[Integer] [Integer]'
    In the type signature for `findBestBalance':
      findBestBalance :: [Integer] [Integer]
Du coup, j'ai essayé d'approfondir la déclaration des fonctions, mais plus j'en lis sur le sujet, moins je comprends ...

Mais, quoi qu'est ce qui cloche !!??

D'avance, merci.

Je donne le source complet ci-dessous :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
module Balance where
 
foreign export ccall "haskellBalance" findBestBalance :: [Integer] [Integer]
 
import Data.Set (size, singleton, union, intersection, mapMonotonic, findMax)
import Data.List (foldl')
 
sums = foldl' (\m x -> m `union` mapMonotonic (+x) m) (singleton 0)
 
findBestBalance :: [Integer] [Integer]
findBestBalance wsLeft wsRight = 
    if size i == 1 then Nothing else Just $ findMax i
        where i = sums wsLeft `intersection` sums wsRight
 
-- pas mesurable
eg1,eg2 :: [Integer]
eg1 = [7991,6765,2584,987,377,144,55,21,8,3,1]
eg2 = [10946,4181,1597,610,233,89,34,13,5,2]
 
-- 410ms
ceg1, ceg2 :: [Integer]
ceg1 = take 100 [2,5..]
ceg2 = take 100 $ 1:[100000,200000..]
 
 
-- 1,61s
seg1, seg2 :: [Integer]
seg1 = take 100 $ 10015900 : [2,5..]
seg2 = take 100 $ 1:1:49:15000:[100000,200000..]
J'essaierai ensuite de faire retourner le résultat par cette fonction plutôt que de l'afficher à l'écran. Mais bon, je verrais ça après. On va y aller petit à petit ...