2017-09-18 8 views
-2

haskell에서 람다 함수 응용 프로그램?</p> <pre><code>-- | 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 </code></pre> <p>내가이 작성 관리 : 시험이 코드를 갖는

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

괄호 역겨운 봐, 내가 어떻게 그들을 밖으로 작동합니까?

답변

6

palindromeTest

귀하의 표현 :

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

훨씬 이해가되지 않습니다 : 동등한 표현은 다음과 같습니다

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

람다 식의 verb 때문에 로컬 범위했다. 하지만 너는 x이 무엇인지 안다 : 그것은 verb이다.

verb ++ reverse verb 

또는 전체에 : : 그래서 당신과 함께 식을 대체 할 수있는 마지막

palindromeTest verb = isPalindrome (verb ++ reverse verb)

where types = verb::String : \x -> x == Trueid에 해당하기 때문에

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

우리는 또한 == True을 제거 할 수 있습니다 쓸모가 없다. Haskell은 정적으로 타입이 지정되고, 타입은 컴파일시에 해결된다. 그래서이 문장은 아무 것도 추가하지 않습니다. 당신은 함수의 유형 서명에 동사의 유형을 제한 할 수 있습니다 : 그것은 쓸모가 그냥 같은 palindromTest

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

isPalindrome

== True를 작성,이 = True을 쓰는 이유도없고, = False이 경우 조건을 기반으로합니다 ap을 사용하여

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

당신은 더 컴팩트 만들 수 있습니다 : 단순히 조건 자체를 반환

import Control.Monad(ap) 

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

유형 QuickCheck – kaboom

+0

@kaboom 거기에 있습니다 : 문제가되지 않습니다 : quicktest 특별한 아무것도 아니다 : 그것뿐만 아니라 컴파일러를 통과 그래서뿐만 아니라 실행 하스켈을 만듭니다. –

+0

werid, 나는 그것이 QuickCheck 튜토리얼을 기반으로 필요하다고 생각했습니다. 어쨌든 감사합니다! – kaboom