【发布时间】:2018-10-07 16:41:53
【问题描述】:
我是 Haskell 的新手,如果这是一个基本问题,我很抱歉。
我目前有一个 Int 列表,我正在尝试创建一个函数,该函数接受一个变量 x 并根据该变量是否存在于列表中返回一个布尔值。
我已经搜索并找到了 Data.List 查找功能,但这个剂量似乎返回一个布尔值。
我正在使用 GHCi。
谢谢,
【问题讨论】:
标签: haskell
我是 Haskell 的新手,如果这是一个基本问题,我很抱歉。
我目前有一个 Int 列表,我正在尝试创建一个函数,该函数接受一个变量 x 并根据该变量是否存在于列表中返回一个布尔值。
我已经搜索并找到了 Data.List 查找功能,但这个剂量似乎返回一个布尔值。
我正在使用 GHCi。
谢谢,
【问题讨论】:
标签: haskell
先找到你需要的函数的类型。
“检查是否”意味着返回 True 或 False,一个 Bool。
所以该函数接受一个 Int,一个 Int 列表(又名 [Int])并返回 Bool:
Int -> [Int] -> Bool
现在ask hoogle。
elem :: Eq a => a -> [a] -> Bool
Hoogle 是一个非常有用的工具。你可以integrate it with ghci。
【讨论】:
elem 1 [5, 2, 1, 8]或中缀方式1 `elem` [5, 2, 1, 8],在这两种情况下它都会返回True,因为1在列表中。当然你可以使用变量来代替
如果标准的elem 函数不存在,那么find 可能是正确的。
myElem :: (Eq a) => a -> [a] -> Bool
myElem x = maybe False (const True) . find (== x)
还有很多其他方法可以实现它,比如
myElem x = any (== x)
myElem x = or . map (== x)
myElem x = not . null . filter (== x)
myElem x = foldr (\y b -> y == x || b) False
等等
【讨论】:
我已经有 2 个月的时间在业余时间尝试学习 Haskell。专业上,我做了几年 C/C++。我必须说,学习 Haskell 的第一个月是一次令人头晕目眩的经历。如果问题足够简单,我总是尝试自己做事,而不是使用现有的 API,例如 elem。我正在慢慢学习FP的方式,下面是我的解决方案:
isMember n [] = False
isMember n (x:xs)
| n == x = True
| otherwise = isMember n xs
用法:
isMember 2 [1,9,4,5] -- False
isMember 2 [4,5,2,9] -- True
【讨论】:
我这样做更简单。
l=[1,2,3,4,5]
checkIfElem :: Int -> [Int] ->Bool
checkIfElem x l
|x`elem` l =True
|otherwise=False
【讨论】:
checkIfElem = elem 定义的一种极其复杂的方式,因为它完全 等同于它! (Guards 已经检查了布尔值,| condition = True| otherwise = False 因此等同于简单的= condition。剩下的就是checkIfElem x l = elem x l,通过 η-reduction 你可以去掉两边的参数。)