【发布时间】:2016-03-24 09:20:39
【问题描述】:
我在 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 是“无点”,但它们使用的函数 addif 不是。
我不知道如何实现addif 无点功能。有什么办法可以做到if 声明点免费?也许有一个不使用if的技巧?
【问题讨论】:
-
你可以做数学问题,比如` let f x y = 1 - ceiling (fromIntegral (x-y) / fromIntegral y) :: Int`? (这不完全是你所需要的;))
-
但
1 - ceiling (abs $ fromIntegral (x-y) / fromIntegral (max x y)) :: Int应该这样做,如果我没有错过某个地方的一些讨厌的边境案例 - 也许你会想对此进行推理或运行一些快速检查;)(好吧,我错过了一些负面因素,所以你会必须更多absin ...但原理应该很明显...真正的解决方案是微不足道的,留给读者:D) -
一般情况下,您可以将
if语句替换为函数bool :: Bool -> a -> a -> a; bool False f _ = f; bool True _ t = t,在这种情况下,您始终可以形成一个“正常”表达式,可以使用常规方法使其无点。跨度>
标签: haskell functional-programming pointfree