ben kolayca dönüştürebilirsiniz gerçeğini kullanmak istiyorsunuz bir Bool
fromEnum
kullanılarak Int
bir etmek:
addif x acc y = acc + fromEnum (x == y)
Şimdi bunu işaret ücretsiz hale getirme zamanki hileler uygulayarak başlayabilirsiniz
-- Go prefix and use $
addif x acc y = (+) acc $ fromEnum $ (==) x y
-- Swap $ for . when dropping the last argument
addif x acc = (+) acc . fromEnum . (==) x
Ve bunun gibi. Özellikle de sizin için yapabilecekleri araçlar olduğunda, bu noktaya dikkat etmeden tüm eğlenceyi almayacağım.
Alternatif olarak, neredeyse bedava işaret edilmektedir
count x = sum . map (fromEnum . (==) x)
gibi bir fonksiyon yazabiliriz ve hızla oldukça kötü olsun her ne kadar daha yakın almak hileler vardır:
count = fmap fmap fmap sum map . fmap fmap fmap fromEnum (==)
Burada Her fmap
'u (.)
ile değiştirebilmemize rağmen fmap
yerine fmap
'u kullanmanın daha güzel görüneceğini düşünün ve tam olarak aynı kod olacaktır.
> :t fmap fmap fmap sum map
Num a => (a -> b) -> [a] -> b
Yani bir işlev alır: Esasen, (fmap fmap fmap)
yerine Eğer aşağı Broken
count = (sum .: map) . (fromEnum .: (==))
olarak bu yazabiliriz .:
adını verirseniz, birlikte tek bir argüman ve iki argüman fonksiyonunu oluşturan b
'dan1 nolu bir a
nolu listeye ve a
numaralı bir değere döner, çok kötü değil.
> :t fmap fmap fmap fromEnum (==)
Eq a => a -> a -> Int
Ve bu tür nota önemli bir şeydir, Eq a => a -> (a -> Int)
olarak yazılabilir. Bu fonksiyonun dönüş türünüile fmap fmap fmap sum map
girdisi ile eşleştirerek, Eq a => a -> [a] -> Int
türünde bir işlev elde etmek için bunları oluşturabiliriz. Biz addIf
farklı bir sürümünü tanımlayabilirsiniz
chk :: Bool -> (a,a) -> a
chk = ([snd,fst]!!) . fromEnum
chk
Kullanılması: Bool
için Enum
örneğini kullanarak
matematik-chenigans yapmak için izin verdiniz gibi izin fxy = 1 - tavan (fromIntegral (xy)/fromIntegral y) :: Int'? (tam olarak ihtiyaç duyduğunuz şey tam olarak değil;)) – Carsten
ama '1 - tavan (absBenIntegral (xy)/fromIntegral (max xy)) :: Int' bir yerdeki bazı kötü sınır vakalarını kaçırmadım eğer yapmalıyım - belki Bu konuda akıl yürütmek isteyeceksiniz ya da bazı hızlı kontroller yapacaksınız;) (bazı negatifleri özledim, böylece daha çok "abs" olmak zorunda kalacaksınız ... ama prensip açık olmalı ... gerçek çözüm * önemsiz * okuyucunun soluna **: D **) – Carsten
Genel olarak 'if' ifadesini' bool :: Bool -> a -> a -> a; bool False f _ = f; bool True _ t = t', bu durumda her zaman normal yöntemlerle noktaya getirilebilecek "normal" bir ifade oluşturabilirsin. – user2407038