6
votes

Fonction Haskell pour faire partie de la date de chaîne

J'ai une question débutante sur les dates et string dans HASKELLL.

J'ai besoin de faire partie de la date (année, mois ou jour) comme chaîne in haskell . J'ai découvert que si j'écris les deux lignes suivantes dans GHCI xxx

thin lun est de type chaîne . Cependant, je suis incapable de mettre cela dans une fonction. J'ai essayé par exemple les éléments suivants: xxx

mais ce type de type io () et j'ai besoin de string (pas non plus io string , seulement chaîne ).

Je comprends que Do La déclaration crée une monade, que je ne veux pas, mais je n'ai pas été incapable de trouver une autre solution pour obtenir la date à Haskell.

Alors, y a-t-il un moyen d'écrire une fonction comme celle-ci?

Merci d'avance pour toute aide!


0 commentaires

4 Réponses :


10
votes

Si vous souhaitez renvoyer une chaîne représentant l'heure actuelle, il sera avoir em> à être dans l'IO monade, car la valeur de l'heure actuelle change toujours!

Ce que vous pouvez faire est de renvoyer une chaîne dans l'io monade: p> xxx pré>

puis, à partir de votre niveau supérieur (par exemple dans Main), vous pouvez transmettre la chaîne autour de: P>

> main = do
>     s <- getCurrMonth
>     ... do something with s ...


0 commentaires

2
votes

Comme Don dit, il n'ya aucun moyen d'éviter d'utiliser des monades dans cette situation. N'oubliez pas que Haskell est un langage fonctionnel pur, et une fonction doit donc toujours renvoyer la même sortie étant donné une entrée particulière. Haskell.org fournit une excellente explication et introduction ici qui vaut certainement la peine d'être examinée. Vous bénéficieriez également de monad introduction comme Ceci Un didacticiel ou un didacticiel d'E / S Haskell comme Celui-ci . Bien sûr, il y a des tonnes plus de ressources en ligne que vous pouvez trouver. Les monades peuvent initialement être intimidantes, mais elles ne sont vraiment pas aussi difficiles qu'elles semblent au début.

Oh, et je conseille fortement contre l'utilisation de inadaperformio . Il y a une très bonne raison pour laquelle il a le mot "dangereux" dans le nom, et il n'était définitivement pas créé pour des situations comme celle-ci. L'utilisation de cela ne conduira que de mauvaises habitudes et de problèmes dans la ligne.

bonne chance apprendre Haskell!


1 commentaires

Merci beaucoup pour vos liens, je peux enfin comprendre les monades un peu mieux. La façon dont nous sommes enseignées, Haskell à l'école est tout à fait déroutant.



1
votes

Vous ne pouvez pas obtenir qu'une ficelle, elle doit être une chaîne io. En effet, GetCurrons n'est pas une fonction pure, elle renvoie différentes valeurs à des moments différents, il doit donc être dans IO.


0 commentaires

5
votes

Si vous voulez vraiment une fonction pure de ce type, vous devez passer à l'heure explicitement comme un paramètre.

import System.Locale (defaultTimeLocale)
import System.Time (formatCalendarTime, toUTCTime, getClockTime, ClockTime)

main = do now <- getClockTime
          putStrLn $ getMonthString now

getMonthString :: ClockTime -> String
getMonthString = formatCalendarTime defaultTimeLocale "%B" . toUTCTime


1 commentaires

+1 pour montrer comment garder la "partie impure" aussi petite que possible.