我有一个输入:
[ 8 `div` 2 + 1 .. ] !! 2 : [ 1 .. 3 ]
Run Code Online (Sandbox Code Playgroud)
输出是:
[7,1,2,3]
Run Code Online (Sandbox Code Playgroud)
但是...... Haskell首先计算了什么?
我不知道优先级,7来自哪里?
我发现自己处于一种我想要使用allmonadic函数的情况.在我看来,这并不是真的太漂亮了:
f :: Monad m => a -> m Bool
g :: Monad m => [a] -> m Int
g xs = do cnd <- liftM (all (== True)) $ mapM f xs
if cnd
then return 42
else return 0
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
我不知道Haskell,我只想玩它来学习它.我试图理解io,monads等,并在解释器(GHCi,版本7.10.2,WinGHCI)中写了这个:
Prelude> [1,1] >> "ok"
"okok"
Prelude> [1,1,1] >> "ok"
"okokok"
Prelude> [1..10] >> "ok"
"okokokokokokokokokok"
Prelude> [1] >> "ok" >> [1] >> "ok"
"okok"
Prelude> [1,2] >> "ok" >> [1,2] >> "ok"
"okokokokokokokok"
Prelude> [1..10] >> [1..10]
[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)
小心解释一下?为什么列表中的元素数量会影响写入"ok"的次数(或者在最后一种情况下,是否写入数组的次数)?>>运算符不应该这样做,是吗?
Haskell中有任何类型的函数a -> b吗?这意味着,是否有可能编写一个这样的函数f :: a -> b?我不认为这样的函数存在以下原因:假设我们发现f在哪里f :: a -> b,会f 2产生什么?类型的值b,但是什么是b因为Haskell不能从我给出的论据推断(我认为)它?它是否正确?否则,你能给我一个这样的功能的例子吗?
所以我在Haskell中丢失了String元组.我宣布了一个类型:
type Book = [(String, String)]
Run Code Online (Sandbox Code Playgroud)
然后我宣布一本空书:
emptyBook :: Book
emptyBook = []
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个将元素插入到书中的函数.我的解决方案
insert :: String -> String -> Book -> Book
insert a b emptyBook = (a,b) : []
insert a b (x : xs)= (a, b) : (x:xs)
Run Code Online (Sandbox Code Playgroud)
但是函数插入不起作用.编译器加载模块但会发出警告"模式匹配是多余的".
执行插入"a" "1" [("b","2")]使[("a","1")]
代替[("a","1"),("b","2")]
你知道这里出了什么问题吗?
我在Haskell模块中有以下数据类型,我想编写一个可存储的实例,将其与C通过FFI一起使用:
data MyType a =
TypeDouble Double
| TypeLst [a]
| TypeAdd (MyType a) (MyType a)
Run Code Online (Sandbox Code Playgroud)
我开始定义sizeOf函数:
instance Storable a => Storable (MyType a) where
sizeOf (TypeDouble _) = sizeOf (0 :: Double)
sizeOf (TypeLst lst) = sum $ map sizeOf lst
sizeOf (TypeAdd a b) = sizeOf a + sizeOf b
Run Code Online (Sandbox Code Playgroud)
编译得很好,但我不知道如何实现peek和poke功能.我认为实现这些函数的方式与此答案相同,但只有当列表中的所有元素具有相同的大小(此处不是这种情况)时,此实现才起作用.
对于元素具有浮动大小的递归类型,实现peek和poke函数的正确方法是什么?
该程序将 n 个零添加到列表 x 示例中
填充零 "100" 1 "0100" 填充零 "10" 4 "000010"
我的代码:
fillZeros :: (Eq a, Num a) => [Char] -> a -> [Char]
fillzeros x 0 = x
fillzeros (x:xs) a = (0:fillzeros (x:xs) a-1)
Run Code Online (Sandbox Code Playgroud)
类型签名中缺少变量“fillZeros”的绑定,每次重新加载时都会出现此错误:r
class Collection c where
empty :: c key value
singleton :: key -> value -> c key value
insert
:: Ord key
=> key -> value -> c key value -> c key value
lookup :: Ord key => key -> c key value -> Maybe value
delete :: Ord key => key -> c key value -> c key value
keys :: c key value -> [key]
values :: c key value -> [value]
toList :: c key value …Run Code Online (Sandbox Code Playgroud) 我搜索并找到了一些解决方案,但它们都没有我想到的那样简单,所以你有一个数字列表,[1,2,3,4]并希望打印这样的元组:
[(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
所以通过使用
combinaList :: String -> String
combinaList x = [(x,y) | x <- x, y <- drop 1 x ]
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩,从列表中删除第一个元素并合并两个列表,但是我得到的类型错误,可能还有下降位,因为ghci继续对我抱怨,任何帮助都将不胜感激,谢谢!
所以,我已经定义了lambda数据类型:
data LExpr
= Variable String -- variable
| Apply LExpr LExpr -- function application
| Lambda String LExpr -- Lambda abstraction
deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
现在我想实现Show自己的一个实例.我已经完成了show'大部分工作的功能,但没有使用实例:
show' :: LExpr -> String
show' (Variable a) = a
show' (Apply e1 e2) = "(" ++ show' e1 ++ " " ++ show' e2 ++ ")"
show' (Lambda x e) = "(? " ++ x ++ ". " ++ show' e ++ ")"
Run Code Online (Sandbox Code Playgroud)
我如何实现它,以获得以下输出而不使用显式show'函数:
Main> (Apply (Lambda …Run Code Online (Sandbox Code Playgroud)