2012-10-14 6 views
3

Maybes 목록을 문자열 목록으로 변환하는 데 문제가 있습니다.from Just Haskell

내 목록은 [Nothing, Just 3, Just 9, Nothing, Nothing]과 비슷합니다.

아무 것도 모두 점 ('.')으로 바꾸고 모두 단순한 Int를 'Int'로 바꾸고 싶습니다.

내 솔루션 지금까지 작동하지 않습니다.

[if c == Nothing then c = '.' else show (fromJust c) | c <- [Nothing, Just 3.... etc] ] 

는이 오류 메시지가 나타납니다 : 입력 '='난 그냥 값 c를 제공하지 못할 것 같은데요

'에 구문 분석 오류'. Java 또는 다른 언어와 같습니다.

아이디어가 있으십니까? Data.Maybe

import Data.Maybe 

test = [Nothing, Just 3, Just 9, Nothing, Nothing] 

f :: Show a => [Maybe a] -> [String] 
f = map (maybe "." show) 
+2

Nitpick on nomenclature 그러나 이것은 유형의 종류 인 하스켈에서 중요한 것입니다. '아마도'아마 친절한'* -> * '을 가지므로''아마도''아마도''아마도''아마'의 목록 만 존재할 수 있습니다. 당신의 예제'[아무것도 아니에요, 그냥 3, 그냥 9, 아무것도, 아무것도 없습니다]'Num a => [어쩌면]'또는 아마도 [[Int]'일 것입니다. 그러나 이것은 당신의 문제와 관련이 거의 없습니다. – leftaroundabout

+0

또한 원하는 경우 Nothings를 DataMay의 catMaybes :: [Maybe a] -> [a]를 사용하여 바꿀 수 있습니다. 그것은 당신에게 단지 Ints 만 남겨두고, 다른 것은 아무것도 남기지 않을 것입니다. 그것은 당신이 겪은 것이 아니지만 귀하의 질문을 찾는 다른 누군가가 후에있을 수 있습니다. – AndrewC

답변

8

사용 maybe 당신이 c='.'를 수행하여 목록에서 요소를 수정할 에 지능형리스트를 사용하려는 것입니다. 이것은 하스켈이므로 아무 것도 수정하지 마십시오! (글쎄, STRef 또는 IORef 제외).

[if c == Nothing then "." else show (fromJust c) | c <- [Nothing, Just 3.... etc] ] 

트릭을 수행합니다 당신은 이미 지능형리스트 자체의 사용에 의해 암시, 당신은 "."c을 대체 지정할 필요가 없습니다. 이 값을 if 문장의 출력 값으로 지정하면됩니다.

(show (fromJust c) 반드시 String을 입력있다. 내가 출력 목록의 모든 요소가 같은 유형이 있어야하기 때문에이 물론 필요하다 "."'.'를 대체합니다, 그래서 우리는 단지에 '.' 같은 Char의를 넣을 수 없습니다 같은 목록입니다.)

그러나 Satvik 및 MathematicalOrchid가 언급 한 대안이 더 좋습니다. 하스켈에서는 일반적으로 maybe 함수와 같은 표준 라이브러리의 고차 함수가있는 경우 명시적인 if 문을 피하려고합니다. 명시 적 의사 결정을 직접 작성하는 경우, 당신은 다음과 같은 작업을 수행 할 수

[ case c of 
    Nothing -> "." 
    Just number -> show number 
| c <- [Nothing, Just 3.... etc] ] 
8

처럼 if을 통해 일치하는 패턴을 선호한다 :

[if c == Nothing then '.' else show (fromJust c) | c <- [Nothing, Just 3.... etc] ] 

당신은 c = 부분을 작성할 필요가 없습니다; 돌아올 것을 말하십시오.

그러나 여기서 원하는 것은 maybe 기능입니다. Nothing을로 바꾸려면 값이 필요하고 Just 일 때는 적용 할 값이 필요합니다. 귀하의 경우,

[maybe "." show c | c <- [...whatever...] ] 

해야합니다. 아니면 할 수 있습니다

map (maybe "." show) [...whatever...] 

어느 것이나 당신의 공상을 간질입니다.(IMHO, 후자는 더 명확합니다.)