有点困惑.fmap听起来它可以在map所有的列表中Maybe,但如果我使用eg,我无法让它工作fApplyFunctor = (+1) <$> [Just 1, Just 2].
看起来完美无缺的是:map ((+1) <$>) [Just 1, Just 2, Just 3].从某种意义上来说,这似乎有点矫枉过正,我记得fmap已经可以做到这一点......
如果我遵循 Real World Haskell (JSON 示例)中的示例,并且首先忽略模块中括号的错误,那么当我编译时,我仍然会遇到以下错误
ld:架构 x86_64 的 38 个重复符号 clang:错误:链接器命令失败,退出代码 1(使用 -v 查看调用)
gcc' failed in phase链接器'。(退出代码:1)
有人知道这是什么以及如何解决吗?有人在 Real World Haskell tut 中也遇到过这个问题吗?
data CouldBe a = Is a | Lost deriving (Show, Ord)
instance Eq (CouldBe m) where
Is x == Is y = x == y
Lost == Lost = True
_ == _ = False
Run Code Online (Sandbox Code Playgroud)
给出错误No instance for (Eq m) arising from a use of ‘==’
:
instance (Eq m) => Eq (CouldBe m) where
Is x == Is y = x == y
Lost == Lost = True
_ == _ = False
Run Code Online (Sandbox Code Playgroud)
工作正常(至少我开始理解错误),但是为什么我需要该约束?我正在尝试学习,所以“为什么”对我来说非常重要。
仍然没有百分之一百的人知道如何制作更复杂类型的实例。拥有这个:
data CouldBe a = Is a | Lost deriving (Show, Ord)
Run Code Online (Sandbox Code Playgroud)
做的一个实例Functor,使用Maybe为例:
instance Functor CouldBe where
fmap f (Is x) = Is (f x)
fmap f Lost = Lost
Run Code Online (Sandbox Code Playgroud)
对于这样的事情:
tupleCouldBe :: CouldBe a -> CouldBe b -> CouldBe (a,b)
tupleCouldBe x y = (,) <$> x <*> y
Run Code Online (Sandbox Code Playgroud)
CouldBe需要成为的实例Applicative,但是您将如何处理呢?当然,我可以查找并复制它,但是我想学习其背后的过程,最后以instance声明CouldBe结尾。
通过Typeclassopedia进行一些使用类型类的路由。想要替代Either的实例Functor,但即使检查的定义Either也Functor使我陷入麻烦。有这个,但是不会编译。
data Alt a b = Success a | Failure b deriving (Show, Eq, Ord)
instance Functor (Alt a) where
fmap _ (Failure a) = Failure a
fmap f (Success x) = Success (f x)
• Couldn't match expected type ‘a1’ with actual type ‘a’
‘a1’ is a rigid type variable bound by
the type signature for:
fmap :: forall a1 b. (a1 -> b) -> Alt a a1 -> Alt a …Run Code Online (Sandbox Code Playgroud) 鉴于:
mangle :: String -> String
Run Code Online (Sandbox Code Playgroud)
我想做的事情如下:
mangle xs = head xs -- works if you change typesig to [a] -> a
Run Code Online (Sandbox Code Playgroud)
但:
mangle xs = tail xs ++ head xs -- won't work at all!
Run Code Online (Sandbox Code Playgroud)
想要在该列表的末尾追加列表的第一个字符,删除第一个字符.
关于MonadWriter的Noob问题:
monadWrite :: Writer String Int
monadWrite = writer (3003, "log 1\n")
Run Code Online (Sandbox Code Playgroud)
为什么它String首先出现在typeig中Int,然后3003是第二个,而显然是Int一会儿"log 1\n"是一个String。我知道微不足道,但我想了解。
我试图深入研究,考虑到它对我来说似乎是一个非常强大的资产.但是,你能帮我解决这个问题:
foldr (/) 2 [1,2,3] -- (1/(2/(3/2))), result 0,75 {where 2 is base)
foldr1 (/) [2,2,3] -- (1/(2/(3/2))), result 3.00 {where 2 is base)
Run Code Online (Sandbox Code Playgroud)
我认为我正在认真监督褶皱之间的本质区别.谢谢
初学者。有一个名为 HHtml 的模块输出这个:
setDoc = "<!DOCTYPE = <html><head>"
setTitle = "<title>" ++ htmlTitle generator ++ "</title>"
setHeader = "<header>" ++ htmlHeader generator ++ "</header>"
setMeta = "<meta>" ++ htmlMeta generator ++ "</meta></head>"
setBody = "<body>" ++ htmlBody generator ++ "</body>"
setFooter = "<footer>" ++ htmlFooter generator ++ "</footer>"
setEOF = "</html>"
setHTML = [setDoc, setTitle, setHeader, setMeta, setBody, setFooter, setEOF]
Run Code Online (Sandbox Code Playgroud)
主文件:
import HHtml
import System.IO
main = do
let content = mapM_ putStrLn setHTML
writeFile "index.html" content
Run Code Online (Sandbox Code Playgroud)
然而,现在我看着它,我不断地得到这个Couldn't match …
如何从stack生成的框架(stack new myprog simple)创建可执行文件?myprog.cabal然后显示myprog为可以使用执行的可执行文件stack exec myprog。但是:使用./myprog将不起作用。除非我打电话给我ghc --make src/Main.hs。显然,这可以正常工作并且很好地嵌入了模块,但是现在可执行文件称为Main。有没有一种方法可以将其stack编译myprog为完整的可执行文件,并且可以在设置了环境路径的情况下从任何地方调用?
haskell ×10
functor ×2
ghc ×2
typeclass ×2
applicative ×1
constraints ×1
either ×1
fold ×1
io ×1
map-function ×1
monads ×1
tail ×1
types ×1
writer ×1