Вы не можете использовать head
, поскольку аргумент здесь IO [a]
, а не a
. Однако вы можете fmap :: Function f => (a -> b) -> f a -> f b
на этом, и, таким образом, получить IO a
, или использовать псевдоним оператора <$>
.
При этом, используя filterM
здесь не необходимо, вы можете просто отфильтровать список, а затем взять голову:
pomFile <- (head . filter ("pom.xml" ==)) <b><$></b> listDirectory path
Однако вышеприведенное не безопасно . Если каталог содержит "pom.xml"
, он просто вернет FilePath
(String
), то есть "pom.xml"
. Если это не так, это вызовет ошибку, которая говорит о том, что вы хотите получить заголовок пустого списка.
Таким образом, вы, вероятно, можете просто работать с:
hasPomFile <- elem "pom.xml" <$> listDirectory path
здесь hasPomFile
таким образом, это Bool
, то есть True
, если каталог содержит "pom.xml"
, и False
в противном случае.