使用lambdabot的pl插件,
let iterate f x = x : iterate f (f x) in iterate
Run Code Online (Sandbox Code Playgroud)
转换为
fix ((ap (:) .) . ((.) =<<))
Run Code Online (Sandbox Code Playgroud)
这(=<<)意味着什么?我以为它只与monad一起使用.
module Main where
newtype Rec a b = Rec {deRec :: Rec a b -> a}
infixl 1 >|>
infixl 1 <|<
(>|>) = Rec
(<|<) (Rec x) = x
fix f = (\x -> f (x <|< x)) (Rec (\x -> f (x <|< x)))
factorial = fix (\f x -> if x<=1 then 1 else x*f(x-1))
main = do
x <- getLine
putStrLn (show (factorial (read x)))
Run Code Online (Sandbox Code Playgroud)
GHC回应:
ghc: panic! (the 'impossible' happened)
(GHC version 7.6.3 for x86_64-apple-darwin): …Run Code Online (Sandbox Code Playgroud) 该声明不起作用:
data Identity a where {Identity :: (->) a (Identity a)}
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
let x=1
y=2
z=3
Run Code Online (Sandbox Code Playgroud)
在GHCi中不起作用,迫使我let {x=1;y=2;y=3}改用.我该如何解决这个问题?
在Common Lisp中,有"read macros"可用于解析Lisp代码的语法.
允许递归类型的OCaml -rectypes的GHC等价物是多少?我没有在文档中看到一个.它是隐藏的功能吗?
我听说Haskell中的各种类型系统hacks(unsafePerformIO,模板Haskell,任意级别多态,......)可以用来强制不同类型,但我还没有看到显式实现.怎么做,至少在GHC?
我试过这个:
class Functor f where
fmap :: (a -> b) -> f a -> f b
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
fmap f x = pure f <*> x
Run Code Online (Sandbox Code Playgroud)
我懂了:
`fmap' is not a (visible) method of class `Applicative'
Run Code Online (Sandbox Code Playgroud)
如何定义fmapfor Applicative和其他子类Functor?