![](/img/trans.png)
[英]What is the way to describe the type signature of Haskell functions that are not type-specific?
[英]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.