2017-01-22 2 views
0

주어진 문자열의 모든 접두어 목록을 반환하는 함수를 작성합니다.haskell의 접두어 목록

여기까지 내가 지금까지 있습니다.

prefixess [x] [] = [x] 
prefixess [] s = prefixess [s] s 
prefixess [x] s = prefixess [x, (init s)] (init s) 
prefixes s = prefixess [] s 

는 컴파일,하지만 난 문자열에 그것을 실행하려고 할 때이 얻을 :

Couldn't match type ‘Char’ with ‘[t]’ 
Expected type: [[t]] 
    Actual type: [Char] 
Relevant bindings include 
    it :: [t] -> [[t]] (bound at <interactive>:18:1) 
In the first argument of ‘prefixess’, namely ‘"abcde"’ 
In the expression: prefixess "abcde" 
In an equation for ‘it’: it = prefixess "abcde" 

내가 아이디어에서 오전. 어떤 힌트?

답변

1

나는이 코드가 당신이 생각하는대로한다고 생각하지 않는다. 싱글 톤리스트의 요소를 포착하는 [x] 패턴으로리스트 x를 패턴 매치하려고 시도합니다. 나는 다음과 같은 코드를 수정하면, 작동 :

prefixess x [] = x 
prefixess [] s = prefixess [s] s 
prefixess x s = prefixess ((init s):x) (init s) 
prefixes s = prefixess [] s 

이것은 다음과 같은 결과를 제공합니다

Main> prefixes "stackoverflow" 
["","s","st","sta","stac","stack","stacko","stackov","stackove","stackover","stackoverf","stackoverfl","stackoverflo","stackoverflow"] 

을하지만 당신이 정말로, 내가 작성합니다 접두사를 계산하는 함수의 축적이 필요하지 않습니다 이 같은 :

이 기능은 Data.List

에서 "inits"또한 이름에서 볼 수 있습니다

prefixes' (x:xs) = [] : (map (x:) (prefixes xs)) 
prefixes' [] = [[]] 
+0

좋아, 이것은 계몽적이었습니다. 나는 방금 ":"연산자가 어떻게 작동하는지에 관해 배웠다. 감사합니다. – Dystr