2014-07-24 2 views
4

Ainsi, les œuvres suivantes dePureScript ne compose pas `trace` et` show`

main = do 
    trace $ show $ 5 

mais cela ne

main = do 
    (trace . show) 5 

dans pSIC le type de trace est

forall r. Prim.String -> Control.Monad.Eff.Eff (trace :: Debug.Trace.Trace | r) Prelude.Unit 

et le type de spectacle est

forall a. (Prelude.Show a) => a -> Prim.String 

puisque la valeur de retour de show est Prim.String et la première entrée dans la trace est Prim.String ils doivent être composables. Ceci est en outre démontré par le fait que trace $ show passe le contrôle de type. Mais à la place, j'ai cette erreur:

Error at line 1, column 10: 
Error in declaration it 
Cannot unify Prim.Object with Prim.Function Prim.String. 

Qu'est-ce qui me manque ici? En ce moment mon modèle mental est que trace est très similaire à putStrLn dans Haskell, et que l'on peut certainement composer avec show. (putStrLn . show) 5 œuvres.

type attendu de résultat composé de trace et spectacle:

forall a r. (Prelude.Show a) => a -> Control.Monad.Eff.Eff (trace :: Debug.Trace.Trace | r) Prelude.Unit 

Répondre

5

. n'est pas la composition de fonctions, mais property access dans PureScript, comme on peut le voir par

main = show $ { test : "Hello, string property" } . test 

L'opérateur de composition de fonction est appelé <<<, probablement après le same operator in Control.Arrow (Haskell).

+0

Quelle est la composition standard alors? – Fresheyeball

+0

@Fresheyeball: N'a trouvé aucun dans la documentation. Vous pouvez en écrire un vous-même, mais le JavaScript compilé semble trop compliqué. – Zeta

+0

Je préfère ne pas, il appartient vraiment dans le prélude. – Fresheyeball