System.Directory.getFileSize path
IO, dizin içeriğinin boyutlarını ararken sorun mu yaşıyor? Bugün Haskell ve amacıma öğreniyorum
path
ise, mantık
path
bir dosya ise birlikte bir işlevisizeOf :: FilePath -> IO Integer
(Bir dosya veya klasörün boyutunu hesaplamak) yazmaktır bir dizin bir dosya veya dizin başka bir şey varsa, sonuçlar- yinelemeli, içeriğinin bir listesini almak onlara bu fonksiyonu çalıştırmak ve
sum
olduğunureturn 0
Ben Ruby bunu uygulamak istiyorum göstermek için nasıl (Yakut notları: reduce :+
foldl (+) 0
olduğunu map
'ın argümanı \d -> size_of d
eşdeğerdir, ?
döner bool biten herhangi bir işlev, döner örtülü olan):
def size_of path
if File.file? path
File.size path
elsif File.directory? path
Dir.glob(path + '/*').map { |d| size_of d }.reduce :+
end
end
benim problem nerede olduğunu biliyorum sizeOf :: FilePath -> IO Integer
sizeOf path =
do
isFile <- doesFileExist path
if isFile then
getFileSize path
else do
isDir <- doesDirectoryExist path
if isDir then
sum $ map sizeOf $ listDirectory path
else
return 0
:
İşte Haskell ona benim çatlak var. listDirectory path
bir IO [FilePath]
ve bir FilePath
döndüren sum $ map sizeOf $ listDirectory path
. Ama ... Bunu çözerken herhangi bir çözüm hayal bile edemiyorum. yerine $
ait <$>
Ben a -> b
bir fonksiyonu bir Context a -> Context b
haline gelmesine izin şey olduğu anlaşılan <$>
beri aklıma gelen ilk şeydi. Ama ... sanırım öyle değil mi?
double = (*) 2
, map double [1,2,3] == [2,4,6]
ama map double <$> [return 1, return 2, return 3] == [[2],[4],[6]]
... Bu liste halinde sarar. Sanırım bu bana oluyor ama ben derinlikten çıkıyorum.
'Ama ... GÇ böyle değil?' Tam olarak böyle yani Eh, 'IO' bir monad ve bu nedenle funktoru olduğunu ama aradığınız şey muhtemelen (>> =) '- monadik hesaplamaları zincirlemenin bir yoludur. Sadece manga öğreticileri okumaya gitme! Bazı haskell kitaplarına gir. – user2847643
'harita çift <$> [1,2,3]' çok garip bir şey yapmadıkça bir tür hatadır. –
Oh iyi yakalamak @DanielWagner. Ben harita çift <$> [dönüş 1, dönüş 2, dönüş 3] 'yazmak istedim. 'IO' bağlamında 'return' değerinin sarıldığını duymuştum, bu yüzden 'IO Integer' üzerindeki işlemleri denemek ve test etmek için kullanıyordum. Ama sanırım kafam karıştı, 'x dönüşü bir' Monad x' yapmak gibi görünüyor, ve eğer bir blokta iseniz sadece bir 'IO x' gibi görünüyor? Belki de monad'lara girmeden öğrenebildiğim sınırın üstündeyim (öğretmenim son noktaya kadar gitmeyi tavsiye etti) ... – GreenTriangle