2017-01-22 13 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"] 

しかし、あなたが本当にプレフィックスを計算する関数のためのアキュムレータを必要としない、私は書きますがそれこのような:

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

この機能はData.List

0123に名「のINIT」の下でも使用可能です
+0

これは啓発だった。私はちょうど ":"演算子がどのように働くかについて何かを学んだと思う。 多くの感謝! – Dystr