2017-09-18 3 views
-2

Avoir ce code à tester:application de la fonction avec lambda dans haskell?

-- | this function checks if string or list are a palindrome 
    isPalindrome :: (Eq a) => [a] -> Bool 
    isPalindrome x = 
     if reverse x == x 
      then True 
      else False 

j'ai réussi à écrire ceci:

-- | how do I remove ugly parentheses our of here? 
palindromeTest verb = isPalindrome ((\verb -> verb ++ reverse verb) verb) == True 
    where types = verb::String 

Parenthèses regarder dégoûtant, comment puis-je les travailler?

Répondre

6

palindromeTest

Votre expression:

(\verb -> verb ++ reverse verb) verb 

ne fait pas beaucoup de sens: une expression équivalente serait:

(\x -> x ++ reverse x) verb 

depuis verb dans l'expression lambda a été SCOPED localement. Mais vous savez ce que x est: c'est verb. Ainsi, vous pouvez remplacer l'expression avec:

verb ++ reverse verb 

Ou en pleine:

palindromeTest verb = isPalindrome (verb ++ reverse verb) == True

On peut aussi éliminer le == True, puisque \x -> x == True est équivalent à id:

palindromeTest verb = isPalindrome (verb ++ reverse verb)

Enfin, le where types = verb::String est inutile aussi: Haskell est typé statiquement, les types sont résolus au moment de la compilation. Donc, cette déclaration n'ajoute rien. Vous pouvez limiter le type de verbe dans la signature de type de la fonction:

palindromeTest :: String -> Bool 
palindromeTest verb = isPalindrome (verb ++ reverse verb)

isPalindrome

Tout comme dans palindromTest il est inutile d'écrire == True, il n'y a aucune raison d'écrire = True et = False si cela est basé sur une condition: il suffit de retourner l'état lui-même:

-- | this function checks if string or list are a palindrome 
isPalindrome :: (Eq a) => [a] -> Bool 
isPalindrome x = reverse x == x

Vous pouvez le rendre plus compact en utilisant ap:

import Control.Monad(ap) 

-- | this function checks if string or list are a palindrome 
isPalindrome :: (Eq a) => [a] -> Bool 
isPalindrome = ap (==) reverse
+0

types est là pour QuickCheck – kaboom

+0

@kaboom: qui n'a pas d'importance: quicktest est rien de spécial: il crée un exécutable Haskell ainsi, il passe par le compilateur ainsi. –

+0

werid, j'étais sous l'impression qu'il est nécessaire, basé sur le tutoriel QuickCheck. Quoi qu'il en soit, merci! – kaboom