つづいての6.2章のリストに対する再帰も
let pd [] = 1
let pd (n:rest) = n * pd rest
pd [1,3,4]
*** Exception: <interactive>:44:5-29: Non-exhaustive patterns in function pd
とおこられる
そういえば1.5章のHaskellの妙味のsumの定義も再帰関数だが
これも動かない
let ss [] =0
let ss (x:rest) = x + ss rest
ss [1,3]
*** Exception: <interactive>:41:5-29: Non-exhaustive patterns in function ss
Quick startにちょろっと書かれていてもわかりづらい。。
http://projects.haskell.org/diagrams/doc/quickstart.html
There's actually nothing special about the (#) operator: it's just reverse function application, that is,
> x # f = f x
let (.) :: a -> (a -> b) -> b; (.) = flip ($)
let f x = x^2
2 . f . f
予約語でないascii記号
let (.) :: a -> (a -> b) -> b; (.) = flip ($)
let (#) :: a -> (a -> b) -> b; (#) = flip ($)
let (&) :: a -> (a -> b) -> b; (&) = flip ($)
let (%) :: a -> (a -> b) -> b; (%) = flip ($)
let (?) :: a -> (a -> b) -> b; (?) = flip ($)
let (!) :: a -> (a -> b) -> b; (!) = flip ($)
+,-,*,/も定義できるが標準機能を上書きしてしまう
二文字以上であれば他のascii記号をまぜても大丈夫みたい(例外はあるとおもうが)
let (||) :: a -> (a -> b) -> b; (||) = flip ($)
let (=~) :: a -> (a -> b) -> b; (=~) = flip ($)
let (!~) :: a -> (a -> b) -> b; (!~) = flip ($)
let (.=) :: a -> (a -> b) -> b; (.=) = flip ($)
let (@=) :: a -> (a -> b) -> b; (@=) = flip ($)
手元のエラー(型違いということなのだろう)
<interactive>:84:2:
No instance for (RealFloat Integer) arising from a use of `*'
Possible fix: add an instance declaration for (RealFloat Integer)
In the expression: i * i
In an equation for `it': it = i * i
またここにも
http://projects.haskell.org/diagrams/gallery/Quasifuchsian.html
> data Moebius = M !C !C !C !C deriving (Eq,Show)
と「!」マークがならぶ
同じ疑問を盛った人がいた
遅延評価しないということですね
http://stackoverflow.com/questions/993112/what-does-the-exclamation-mark-mean-in-a-haskell-declaration
>The third parameter, however, has a ! in front of it, so is strictly evaluated: (4+4) is executed, and 8 is stored in that memory location.
import Data.Complex
let i = 0 :+ 1
type C = Complex Double
としておいて
-------------------
:type i
i :: Complex Integer
-------------------
:info i
i :: Complex Integer -- Defined at <interactive>:14:5
-------------------
:info C
type C = Complex Double -- Defined at <interactive>:19:6
-------------------
:info Complex
data Complex a = !a :+ !a -- Defined in `Data.Complex'
instance Eq a => Eq (Complex a) -- Defined in `Data.Complex'
instance RealFloat a => Floating (Complex a)
-- Defined in `Data.Complex'
instance RealFloat a => Fractional (Complex a)
-- Defined in `Data.Complex'
instance RealFloat a => Num (Complex a)
-- Defined in `Data.Complex'
instance Read a => Read (Complex a) -- Defined in `Data.Complex'
instance Show a => Show (Complex a) -- Defined in `Data.Complex'
-------------------
:kind Complex
Complex :: * -> *
--------------------
:browse Data.Complex
data Complex a = !a :+ !a
cis :: RealFloat a => a -> Complex a
conjugate :: RealFloat a => Complex a -> Complex a
imagPart :: RealFloat a => Complex a -> a
magnitude :: RealFloat a => Complex a -> a
mkPolar :: RealFloat a => a -> a -> Complex a
phase :: RealFloat a => Complex a -> a
polar :: RealFloat a => Complex a -> (a, a)
realPart :: RealFloat a => Complex a -> a
import System.Environment (getArgs)
getProgName
<interactive>:3:1: Not in scope: `getProgName'
import System.Environment as E (getArgs)
getArgs
[]
E.getArgs
[]
E.getArgsだけでgetArgsはもってこないようにするには
import qualified System.Environment as E (getArgs)
E.getArgs
[]
getArgs
<interactive>:4:1:
Not in scope: `getArgs'
Perhaps you meant `E.getArgs' (imported from System.Environment)