我正在学Haskell(不,这不是我的作业,我正在为考试学习)。
任务是:
编写一个无参数函数
numocc
,用于计算给定列表中元素的出现次数。例如:numocc 1 [[1, 2], [2, 3, 2, 1, 1], [3]]
=[1, 2, 0]
这是我的代码:
addif :: Eq a => a -> Int -> a -> Int
addif x acc y = if x == y then acc+1 else acc
count :: Eq a => a -> [a] -> Int
count = flip foldl 0 . addif
numocc :: Eq a => a -> [[a]] -> [Int]
numocc = map . count
numocc
和count
是'point-free'的,但它们使用的addif
函数不是。
我不知道如何使函数addif
成为'point-free'。有没有一种方法可以使if
语句成为'point-free'?也许有一种技巧可以不用if
实现?
let f x y = 1 - ceiling (fromIntegral (x-y) / fromIntegral y) :: Int
这样的数学操作吗?(这也不完全是你所需要的 ;)) - Random Dev1-ceiling(abs $ fromIntegral(x-y)/fromIntegral(max x y)) :: Int
就可以解决问题了 - 也许您会想要对此进行推理或运行一些快速检查;)(好吧,我错过了一些负数,所以你需要更多的“abs”...但原则应该是显而易见的...真正的解决方案是微不足道的,留给读者:D) - Random Devbool:: Bool->a->a->a
替换if
语句。其中,当 bool 函数的第一个参数为 False 时,结果为第二个参数;当第一个参数为 True 时,结果为第三个参数。通过这种方式,您可以始终形成一个“正常”的表达式,并使用常规方法将其转化为 point free 形式。 - user2407038