哈斯克尔真的不知道该怎么称呼这个



我试图使其在元组输入(n,m(和元组列表xs上,如果xs中元组中的第一个项在(n,m(中,则在新列表中保持这种方式,否则添加一个由从n到m的某个值k组成的元组作为第一个元素,作为第二个元素,它应该是0。我的问题是:我怎么能说"重复0";使用警卫?因为很明显,我的代码不会运行,因为我的代码说";repeat=0";

expand :: (Int,Int) -> Profile ->Profile
expand (n,m) [] = zip [n..m] (repeat 0)
expand (n,m) (x:xs) = zip [n..m] (repeat (|(fst (x) `elem` [n..m]) == False = 0
|otherwise = snd (x))

您可以在此处使用助手函数,将[ n .. m ]范围内的数字转换为2元组。因此,在这里,我们试图在列表xs中找到与该元组的第一项匹配的元素,如果我们没有找到这样的元素,我们使用0:

import Data.List(find)
expand :: (Int,Int) -> Profile -> Profile
expand (n,m) xs = mapgo[n .. m]
wheregoi | Justl<- find ((f, _) -> f == i) xs =l
| otherwise = (i, 0)

对于列表,find实现为[src]:

因此,
find            :: (a -> Bool) -> [a] -> Maybe a
find p          = listToMaybe . filter p

filter将生成一个包含满足谓词p的元素的列表,并且listToMaybe :: [a] -> Maybe a将空列表[]转换为Nothing,对于非空列表(x:_),它将在Just数据构造函数中封装第一个元素x。由于Haskell的惰性,它将查找满足谓词的第一个元素。

这就给了我们:

Prelude Data.List> expand (2,7) [(4, 2.3), (6, 3)]
[(2,0.0),(3,0.0),(4,2.3),(5,0.0),(6,3.0),(7,0.0)]

最新更新