2014-06-22 55 views
1

後有點hoogle-ING我想出了這一點:查找字符串中的一些子串的位置

import Data.List 
substrPos xs str = map (\x -> findIndex (isPrefixOf x) $ tails str) xs 

這應該給我,表示每個字符串的str首次亮相指數列表在xs

例如爲:

Prelude Data.List> substrPos ["Foo", "Bar"] "FooBar" 
[Just 0,Just 3] 

的問題是我怎麼能寫更地道,也許我會失去拉姆達? 也許某種程度上(功能組成?)刪除包含isPrefixOf x的parens? 也許寫點自由風格?

我應該如何去思考這些事情?

PS:我能想到的唯一修改(在首次寫入函數之後)是通過函數應用程序從tails xs中去除了parens。

+0

您可能想看看這會更合適,並在[codereview.se]獲得更多關注。 – icktoofay

+0

謝謝,我會根據需要。 – Paul

+0

雖然你可以通過其他幾種方式來寫(除了免費,你可以用另一種方式去使用列表理解),但我認爲你的代碼有足夠的習慣用法。儘管如果你的參數順序是相反的,我會建議丟失顯式的'xs'。 –

回答

3

您可以隨時安裝pointfree工具並自行檢查並嘗試理解所得到的代碼。

Pointfree工具讓我得到以下結果:

map (($ tails str) . findIndex . isPrefixOf) xs 

雖然你要注意,pointfree風格並不總是習慣。有些人認爲這是不可讀的,pointless

+0

感謝您指出該工具,我想我理解了它的結果。事實上,結果可能會更難以閱讀,但我這樣做是爲了與哈斯克爾一起練習。 – Paul

相關問題