我目前正在學習haskell,試圖讓一個函式successor要么接受 aNum并回傳其后繼函式( 4 == successor 3) 要么接受自身并回傳一個雙后繼函式 ( 5 == (successor successor) 3)。
使successor函式成為其類的型別的正確方法是Successor什么?
幼稚的Successor階級
class Successor a where
successor :: a -> a
instance Successor Int where
successor n
| (==) 1 n = 2
| otherwise = 1 successor (n - 1)
測驗代碼
n :: Int
n = 3
m = successor (successor n)
main = do
print m -- print 5
需要的行為
n :: Int
n = 3
m = (successor successor) n
main = do
print m -- print 5
uj5u.com熱心網友回復:
這對我來說似乎是一個糟糕的主意——你為什么要撰寫一個既處理數字又處理函式的函式?
無論如何,您可以按如下方式實作您的要求(但可能不是您真正想要的):
{-# LANGUAGE FlexibleInstances #-}
module Main where
class Successor a where
successor :: a -> a
instance Successor Int where
successor n
| (==) 1 n = 2
| otherwise = 1 successor (n - 1)
instance Successor (Int -> Int) where
successor f = f . f
n' :: Int
n' = 3
m1 :: Int
m1 = successor (successor n')
m2 :: Int
m2 = (successor successor) n'
main :: IO ()
main = do
print m1 -- print 5
print m2 -- print 5
該定義successor f = f . f適用于這種特定情況,其中f = successor,但在其他情況下可能不會產生預期的輸出。
我們可以使用一些變體,如successor f = successor . f. 也許這在一般情況下更有用,但對我來說它仍然是一個壞主意。
uj5u.com熱心網友回復:
我同意 chi 的觀點,這可能是一個壞主意,但如果您要擁有這樣一個型別類,那么我會盡可能地使其通用:
class Successor a where
scs :: a -> a
instance Successor Int where
scs = succ -- don't reinvent the wheel
instance Successor a => Successor (c -> a) where
scs f = scs . f
然后
ghci> scs scs (scs (scs scs)) ((scs scs) scs) scs (scs scs) 0 :: Int
11
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387029.html
標籤:哈斯克尔
上一篇:為什么當串列包含零時foldr函式給我一個否定的結果?
下一篇:秒差距條件
