2011-06-03 18 views
6

Kısa bir süre önce Reddit/Hacker News'te açılan 'Scala One Liners' adlı şeyin haskell eşdeğerini denemeye çalışıyorum.Bazı öğeler listede varsa nasıl kontrol edilir?

https://gist.github.com/1005383

Ben eğer doğruluyor şaşırıp bir İşte

Bugüne kadar bu var (insanlar onları benden çok daha iyisini muhtemelen olabilir ama bunlar benim acemi düzey çabalarıdır) öğeler bir listede. Temel olarak Scala örneği, bu Haskell'de bunun nasıl yapılacağı konusunda biraz şaşırdım. Kelimelerin biri varsa

any (=="haskell") $ words "haskell is great!" 

doğrulamak için, ancak wordlistler kelimelerden birini deney dizesinde varsa Scala örneği sorar: Ne yapabileceğini biliyorum.

contains işlevini veya benzeri bir işlevi bulamıyorum. Bunu yapmak için muhtemelen bir işlev yazabileceğinizi biliyorum, ancak bu görevin bir satırda yapılacağı noktayı yener.

Herhangi bir yardım için teşekkür ederiz.

cevap

11

Bir öğenin listede olup olmadığını kontrol eden Prelude öğesinden elem işlevini kullanabilirsiniz. Genellikle infix şeklinde kullanılır:

Prelude> "foo" `elem` ["foo", "bar", "baz"] 
True 

Daha sonra == ile yaptığı gibi bir operatör bölümünde kullanabilirsiniz:


Eğer bir işlev ihtiyacı bulacaksınız

Prelude> let wordList = ["scala", "akka", "play framework", "sbt", "types"] 
Prelude> let tweet = "This is an example tweet talking about scala and sbt." 
Prelude> any (`elem` wordList) $ words tweet 
True 
ama adı bilmiyorsunuz, türüne göre bir işlev aramak için Hoogle kullanmayı deneyin.

Burada, herhangi bir türde bir şeyin aynı türden bir şeyde olup olmadığını denetleyen bir şey istediniz, örneğin a -> [a] -> Bool gibi bir türden bir şey (ayrıca bir Eq kısıtlamasına da ihtiyacınız var, ama bir şey bilmediğinizi varsayalım)) o. Bu tür imzayı Hoogle gives you elem as the top result'a yazarak.

+0

Mükemmel, teşekkürler! – djhworld

6

Data.List.intersect nasıl kullanılır?

import Data.List.intersect 

not $ null $ intersect (words tweet) wordList 
3

Ben any kullanarak orijinal kod ruhu içinde bir şeyler yazmak için güzel olacağını düşündüm iyi cevaplar zaten olsa da. Eğer çeşit İngilizce olarak okuyabilirsiniz biraz yeniden sıralaması ile

any (\x -> any (\y -> (y == x)) $ words "haskell is great!") 
    ["scala", "is", "tolerable"] 

? Elde Böylece oldukça intersect ve elem gibi kullanıma hazır parçalarını kullanarak daha basit yeniden kullanılabilir parçaların kendi karmaşık sorgular oluşturmak için nasıl çalıştığını görmek için : Herhangi bir x cümlesi var, y listede x == y öyle bir liste var mı? İkiden daha fazla 'eksen' nasıl genişletileceği, == dışındaki karşılaştırmalar gerçekleştirilebileceği ve hatta all ile karıştırılabileceği açıktır.

İlgili konular