Trong những ý kiến của câu hỏi Tacit function composition in Haskell, người ta đề cập làm cho một trường hợp Num
cho a -> r
, vì vậy tôi nghĩ rằng tôi muốn chơi với việc sử dụng ký hiệu chức năng để đại diện cho nhân:số như các chức năng nhân giống (lạ nhưng là giải trí)
{-# LANGUAGE TypeFamilies #-}
import Control.Applicative
instance Show (a->r) where -- not needed in recent GHC versions
show f = " a function "
instance Eq (a->r) where -- not needed in recent GHC versions
f == g = error "sorry, Haskell, I lied, I can't really compare functions for equality"
instance (Num r,a~r) => Num (a -> r) where
(+) = liftA2 (+)
(-) = liftA2 (-)
(*) = liftA2 (*)
abs = liftA abs
negate = liftA negate
signum = liftA signum
fromInteger a = (fromInteger a *)
Lưu ý rằng định nghĩa fromInteger có nghĩa là tôi có thể viết 3 4
có giá trị là 12, và 7 (2+8)
là 70, giống như bạn mong đợi.
Sau đó, tất cả đều tuyệt vời, giải trí kỳ lạ! Xin giải thích wierdness này nếu bạn có thể:
*Main> 1 2 3
18
*Main> 1 2 4
32
*Main> 1 2 5
50
*Main> 2 2 3
36
*Main> 2 2 4
64
*Main> 2 2 5
100
*Main> (2 3) (5 2)
600
[Edit:. Sử dụng applicative thay vì Monad vì applicative là rất tốt nói chung, nhưng nó không làm cho nhiều sự khác biệt ở tất cả các code]
Trong GHC 7.4, có thể xóa các trường hợp 'Hiển thị' và' Eq' giả, vì 'Num' không còn yêu cầu chúng nữa. – sdcvvc
'Monad' quá tải ở đây. Các 'Applicative' đơn giản hơn và tổng quát hơn là đủ. – Conal
@sdcvvc Tôi sẽ sớm nâng cấp, vâng. – AndrewC