如果您使用:
positionInList:: Filepath -> Int
positionInList s1 = 1
positionInList s2 = 2
Haskell 将s1和s2视为变量(它会影响现有绑定)。这意味着您的函数将始终返回1。
然而,Haskell 已经有一个函数来获取列表中的索引elemIndex :: a -> [a] -> Maybe Int,因此你可以定义你positionInList的:
import Data.List(elemIndex)
positionInList :: FilePath -> Maybe Int
positionInList = fmap (1+) . flip elemIndex [s1, s2]
这里fmap (1+)将从零开始的索引映射到从一开始的索引。
返回一个Maybe a我们可以使用的这样Nothing通常比返回一个像-1. fromMaybe :: a -> Maybe a -> a但是,如果您想映射Nothing其他值,我们可以使用,例如:
import Data.List(elemIndex)
import Data.Maybe(fromMaybe)
positionInList :: FilePath -> Int
positionInList = fromMaybe (-1) . fmap (1+) . flip elemIndex [s1, s2]