我有一個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 fxy = 1 - ceiling(fromInteral(xy)/ fromIntegral y):: Int'那樣做數學chenigans嗎? (這不完全是你需要的;)) – Carsten
,但'1 - 天花板(絕對$ fromInteral(xy)/ fromIntegral(max xy)):: Int'應該這樣做,如果我沒有錯過任何地方一些討厭的邊界情況 - 也許你會想要推理或運行一些快速檢查;)(以及我錯過了一些負面因素,所以你必須在更多的'abs'中...但原則應該是顯而易見的......真正的解決方案是*微不足道的*並留給讀者**:D **) – Carsten
一般來說,你可以用函數'bool :: Bool - > a - > a - > a替換一個'if'語句; bool False f _ = f; bool True _ t = t',在這種情況下,您總是可以形成一個「常規」表達式,使用常規方法可以使其免於點。 – user2407038