簡體   English   中英

Haskell中的數學函數是否有特定類型?

[英]Is there a specific type for mathematical functions in Haskell?

我想編寫一個函數,該函數需要一個數學函數(/,x,+,-),一個以數字開頭的數字和一個數字列表。 然后,應該返回一個列表。

第一個元素是起始編號,第二個元素是起始編號的值加/減/乘以給定列表的第一個數字。 第三個元素是前一個結果的結果加上/減去/時間/除以給定列表的第二個結果,依此類推。

如果我告訴代碼要使用哪個函數,我將使所有工作正常,但是如果我想讓用戶輸入他想要的數學函數,則類型有問題。 例如,嘗試:t(/)給出Fractional a => a -> a -> a ,但是如果將其放在類型的開頭,它將失敗。

是否存在區分這些功能的特定類型(/,x,+,-)? 還是有另一種成功編寫此函數的方法?

prefix :: (Fractional a, Num a) => a -> a -> a -> a -> [a] -> [a]

prefix (f) a b = [a] ++ prefix' (f) a b


prefix' :: (Fractional a, Num a) => a -> a -> a -> a -> [a] -> [a]

prefix' (z) x [] = []

prefix' (z) x y = [x z (head y)] ++ prefix' (z) (head (prefix' (z) x y)) (tail y)

正確的解決方案是這樣的:

prefix (-) 0 [1..5]

[0,-1,-3,-6,-10,-15]

是否存在區分這些功能的特定類型( /*+- )?

我看不出這樣做的理由。 為什么\\xy -> x+y被認為比\\xy -> x + y + 1 “更好”。 確保將兩個數字相加是大多數人認為更“純”的事情。 但是將自己限制為特定的功能子集很奇怪。 對於某些函數\\xy -> fxy - 1 “ happens”也有可能等於(+) ,除了編譯器無法確定。

類型檢查將確保在給定列表包含字符串等的情況下,不能傳遞對數字進行操作的函數。但是,有意地進一步限制它並不是很有用。 為什么要阻止程序員將函數用於不同目的?

還是有另一種成功編寫此函數的方法?

您在這里描述的是scanl :: (b -> a -> b) -> b -> [a] -> [b]函數。 如果我們用scanl fz [x1, x2, ..., xn]調用scanl ,那么我們將獲得一個列表[z, fz x1, f (fz x1) x2, ...] scanl可以定義為:

scanl :: (b -> a -> b) -> b -> [a] -> [b]
scanl f = go
    where go z [] = [z]
          go z (x:xs) = z : go (f z x) xs

因此,我們首先發出累加器 (從初始值開始),然后將累加器“更新”為fzx其中z為舊累加器, x為列表的開頭,然后遞歸到列表的末尾。

如果要限制這四個操作,只需自己定義類型:

data ArithOp = Plus | Minus | Times | Div

as_fun Plus = (+)
as_fun Minus = (-)
as_fun Times = (*)
as_fun Div = (/)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM