[1..10] ‥→ (1 to: 10) asArray filter isLower "aAbBcC" ‥→ 'aAbBcC' select: [ :each | each isLowercase ] " ==> 'abc' " foldr (+) 0 [1..10] ‥→ (1 to: 10) inject: 0 into: [ :sum :each | sum + each ] " ==> 55 " read "3" + 4 ‥→ '3' + 4 あるいは、(Number readFromString: '3') + 4 " ==> 7 " (read "3")::Int ‥→ Integer readFromString: '3' " ==> 3 " (read "3")::Float ‥→ Float readFromString: '3' " ==> 3.0 " (\x -> x * x) 3 ‥→ [ :x | x * x ] value: 3 " ==> 9 "
fact 1 = 1 fact n = n * fact (n-1) : ↓ Integer >> fact ^ self = 1 ifTrue: [1] ifFalse: [self * (self - 1) fact]
qsort [] = []
qsort (h:t) = qsort (filter (< h) t) ++ [h] ++ qsort (filter (>= h) t)
あるいは、
qsort [] = []
qsort (h:t) = qsort [ x | x <- t, x < h ] ++ [h] ++ qsort [ x | x <- t, x >= h ]
:
↓
ArrayedCollection >> qsort
| h t |
self size < 2 ifTrue: [^ self].
h := self first.
t := self allButFirst.
^ (t select: [ :x | x < h ]) qsort, {h}, (t select: [ :x | x >= h ]) qsort上にも追記しましたが、手続き(あるいは、無名関数)オブジェクトとしての[ toUpper x | x <- "aXbYcZ", isLower x ] : ↓ 'aXbYcZ' select: [ :x | x isLowercase ] thenCollect: [ :x | x asUppercase ] " ==> 'ABC' "
toHexString n
| n < 16 = [toHexDigit n]
| otherwise = toHexString (div n 16) ++ [toHexDigit (mod n 16)]
where toHexDigit x = "0123456789ABCDEF" !! x
:
↓
Integer >> asHexDigit
^ '0123456789ABCDEF' at: self + 1
Integer >> asHexString
self < 16 ifTrue: [^ self asHexDigit asString].
^ (self // 16) asHexString, (self \\ 16) asHexDigit asString
あるいは、
Integer >> asHexString
| toHexDigit |
toHexDigit := [ :x | '0123456789ABCDEF' at: x + 1 ].
self < 16 ifTrue: [^ (toHexDigit value: self) asString].
^ (self // 16) asHexString, (toHexDigit value: self \\ 16) asString
5295 asHexString " ==> '14AF' "
('16r', 5295 asHexString) asNumber " ==> 5295 "--sumim残念ながら、Hugs では zip の要素数の不一致でエラーがでちゃうけど、fib = 1:1:[ a+b | (a,b) <- zip fib (tail fib) ]
newtype Natural = MakeNatural Integer
toNatural :: Integer -> Natural
toNatural x | x < 0 = error "Can't create negative naturals!"
| otherwise = MakeNatural x
fromNatural :: Natural -> Integer
fromNatural (MakeNatural i) = i
instance Num Natural where
fromInteger = toNatural
x + y = toNatural (fromNatural x + fromNatural y)
x - y = let r = fromNatural x - fromNatural y in
if r < 0 then error "Unnatural subtraction"
else toNatural r
x * y = toNatural (fromNatural x * fromNatural y)
:
↓
Reading file "natural.hs":
Type checking
ERROR "natural.hs":10 - Cannot build superclass instance
*** Instance : Num Natural
*** Context supplied : ()
*** Required superclass : Eq Natural--sumimnewtype Natural = Natural Integer
deriving (Show, Eq)
toNatural :: Integer -> Natural
toNatural x
| x < 0 = error "Can't create negative naturals!"
| otherwise = Natural x
fromNatural :: Natural -> Integer
fromNatural (Natural i) = i
instance Num Natural where
fromInteger = toNatural
x + y = toNatural (fromNatural x + fromNatural y)
x - y = let r = fromNatural x - fromNatural y in
if r < 0 then error "Unnatural subtraction"
else toNatural r
x * y = toNatural (fromNatural x * fromNatural y)というように最初の newtype のところに deriving (Show, Eq) を追加すればOKだったみたいです。こちらも思惑通り、うまくゆきました。--sumimfact :: Natural -> Natural fact 0 = 1 fact n = n * fact (n - 1)
とかできると万々歳なのですが、残念ながらそうは問屋は卸さないようで…。fact :: Natural -> Integer fact 0 = 1 fact n = n * fact (n - 1)
fact :: Natural -> Integer
fact n = fromNatural (nfact n)
where
nfact 0 = 1
nfact n = n * nfact (n - 1)などとして、返値の Integer を保証してやらなあかんようです。このページを編集 (10473 bytes)
| 以下の 5 ページから参照されています。 |
This page has been visited 9051 times.