Bonjour,
j'ai découvert ce langage au travers du post là 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 :
J'ai donc tenté de rajouter une ligne ressemblant à ceci :
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
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).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 foreign export ccall "haskellBalance" findBestBalance :: [Integer] [Integer]
En effet, la tentative de compil (ghc -O2 -c balance.hs) me donne l'erreur suivante :
Du coup, j'ai essayé d'approfondir la déclaration des fonctions, mais plus j'en lis sur le sujet, moins je comprends ...
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]
Mais, quoi qu'est ce qui cloche !!??
D'avance, merci.
Je donne le source complet ci-dessous :
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 ...
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..]
Partager