小编lef*_*out的帖子

拥抱,功能及其计算方式

我有一个输入:

 [ 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来自哪里?

haskell

2
推荐指数
1
解决办法
142
查看次数

如何使用具有monadic功能的all?

我发现自己处于一种我想要使用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)

有没有更好的方法来做到这一点?

monads haskell list

2
推荐指数
2
解决办法
105
查看次数

>>运算符 - Haskell中的穷人循环?

我不知道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"的次数(或者在最后一种情况下,是否写入数组的次数)?>>运算符不应该这样做,是吗?

monads haskell list

2
推荐指数
1
解决办法
117
查看次数

在Haskell中使用类型a - > b的函数?

Haskell中有任何类型的函数a -> b吗?这意味着,是否有可能编写一个这样的函数f :: a -> b?我不认为这样的函数存在以下原因:假设我们发现f在哪里f :: a -> b,会f 2产生什么?类型的值b,但是什么是b因为Haskell不能从我给出的论据推断(我认为)它?它是否正确?否则,你能给我一个这样的功能的例子吗?

haskell types type-inference unification

2
推荐指数
1
解决办法
911
查看次数

元组字符串的模式匹配列表

所以我在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 list

2
推荐指数
1
解决办法
308
查看次数

如何为递归类型创建可存储实例?

我在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)

编译得很好,但我不知道如何实现peekpoke功能.我认为实现这些函数的方式与此答案相同,但只有当列表中的所有元素具有相同的大小(此处不是这种情况)时,此实现才起作用.

对于元素具有浮动大小的递归类型,实现peekpoke函数的正确方法是什么?

c binding haskell ffi storable

2
推荐指数
1
解决办法
98
查看次数

Haskell 补零程序

该程序将 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

haskell

2
推荐指数
1
解决办法
80
查看次数

不明白这个集合类语法

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)

haskell

2
推荐指数
1
解决办法
86
查看次数

Haskell,将字符串转换为自身所有可能的"元组"

我搜索并找到了一些解决方案,但它们都没有我想到的那样简单,所以你有一个数字列表,[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继续对我抱怨,任何帮助都将不胜感激,谢谢!

combinations haskell tuples

1
推荐指数
1
解决办法
183
查看次数

lambda抽象ADT的显示实例

所以,我已经定义了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)

haskell instance show typeclass

1
推荐指数
1
解决办法
191
查看次数