小编Jam*_*ter的帖子

在 Haskell 中,种类除了星形序列之外还能是其他什么吗?

如果这个问题很愚蠢,请原谅我。

在阅读 Haskell 类型时,我注意到一个主题:

*
* -> *
* -> * -> *
Run Code Online (Sandbox Code Playgroud)

我的印象是 Haskell 中的类型最终归结为星号的数量。您可能会说,类型的种类实际上只是在它变成 * 之前需要应用于它的类型数量。换句话说,您可以计算除最后一个之外的所有 *,并通过整数定义类型的种类。说 0、1、2 等。

这是我的问题:

这是对 Haskell 类型系统的正确观察吗?或者它是否允许 * 之外的其他内容出现在您通常看到 * 的地方?例如:

* -> a -> *
Run Code Online (Sandbox Code Playgroud)

例如,我想有人可能想要这样做来限制类型变量具有类型类的实例。

Functor a, Applicative b => * -> a -> b -> *
Run Code Online (Sandbox Code Playgroud)

这是一件事吗?

haskell

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

如何强制每秒进行X次评估?

我需要一个实时的事件循环,它执行以下操作:

myEventLoop = do
    businessLogic x0 x1 x2 ... xN
    sleep 0.01
    myEventLoop
Run Code Online (Sandbox Code Playgroud)

我知道eventloop包,但它似乎更适合Web应用程序,而我需要的是实时信号处理。假设采样率为100 Hz。采样率不需要非常精确。如果偶尔只有98 Hz,那没什么大不了的。但是我永远不希望它偏离5%以上。目前,我们仅谈论GHC执行+/- 5%。忽略由于操作系统而导致的计时错误。

我的问题是:1)Haskell可以做这种事情吗?我有点担心+/- 5%的部分。2)睡眠部分效率低下吗?还是在myEventLoop执行睡眠部分时其他Haskell线程可以占用相同的OS线程?3)假设睡眠是一个好主意,硬编码睡眠时间很可能不是。由于程序在x86架构上运行,因此我可以读取时间戳计数器(TSC),但是如果GHC决定将程序切成微线程,将其中的一些发送到1个CPU内核,而将其他的发送到另一个CPU内核,则该方法可能会出现问题。 ,因为不同的核心可以具有不同的TSC值。这是我应该担心的事情吗?如果是,什么是更好的方法?

提前致谢

haskell

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

如何正确选择要连接的USB设备?

我是USB驱动程序和Haskell的新手。我正在尝试使用System.USB连接到Tomu(适合USB端口的ARM微控制器)。我尝试了以下示例:https : //github.com/basvandijk/usb-example/blob/master/example.hs,但是已经过时了几年。我正在尝试在USB上打个招呼,但出现类型错误。

以下代码有效:

module Lib where

import System.USB
import System.USB.IO
import Data.Vector 
import Data.Maybe

getOneDesc :: Int -> IO (VendorId, ProductId) 
getOneDesc n = do
    usbConn <- newCtx
    devList <- getDevices usbConn
    f <- getDeviceDesc $ devList ! n
    let f0 = deviceVendorId f
    let f1 = deviceProductId f
    return (f0, f1)
Run Code Online (Sandbox Code Playgroud)

在repl处,我可以键入getOneDesc 0,然后得到如下所示的内容:

(300, 42)
Run Code Online (Sandbox Code Playgroud)

我认为我应该能够做这样的事情:

isThisDeviceTheOneIWant :: Int -> VendorId -> ProductId -> Bool
isThisDeviceTheOneIWant n a b = do
    (x, y) <- getOneDesc n …
Run Code Online (Sandbox Code Playgroud)

haskell

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

在 Haskell 中,可变性是否总是必须反映在类型系统中?

我是 Haskell 的新手,所以如果这个问题很愚蠢,请原谅。

想象一下,我们有两个绑定到名称xy 的数据结构。

x是可变的。

y不是。

作为一个问题或原则,x是否一定具有与y不同的类型?

haskell type-theory immutability ghc mutability

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

为什么我没有因使用“it”而得到 (Num (m0 b0)) 的实例

我正在阅读《学习 Haskell 时我希望知道什么》,第 72 页上有这样一句话:

\n
\n

第一定律是,当return a传递(>>=)给函数时f,该表达式完全等价于f

\n
\n

所以我正在尝试这样做:

\n
return 3 >>= (+ 1)\n
Run Code Online (Sandbox Code Playgroud)\n

我得到

\n
    No instance for (Num (m0 b0)) arising from a use of \xe2\x80\x98it\xe2\x80\x99\n    In a stmt of an interactive GHCi command: print it\n
Run Code Online (Sandbox Code Playgroud)\n

我究竟做错了什么?

\n

haskell ghc

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

为什么我在函子实例中收到 GHC 无法匹配类型错误?

我正在尝试编写一个 Functor 实例:

\n
module TreeN where\n\ndata TreeN a = LeafN a | ParentN a [TreeN a] deriving (Eq, Show)\n\ninstance Functor TreeN where\n\nfmap f (LeafN x) = LeafN (f x)\nfmap f (ParentN x children) = (ParentN (f x) (TreeN.fmap f children))\n\n
Run Code Online (Sandbox Code Playgroud)\n

我收到此错误:

\n
src/TreeN.hs:7:1: error:\n    \xe2\x80\xa2 Couldn't match type \xe2\x80\x98TreeN t\xe2\x80\x99 with \xe2\x80\x98[TreeN t]\xe2\x80\x99\n      Expected type: (t -> a) -> [TreeN t] -> [TreeN a]\n        Actual type: (t -> a) -> TreeN t -> TreeN a\n    \xe2\x80\xa2 Relevant bindings …
Run Code Online (Sandbox Code Playgroud)

haskell functor ghc

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

Haskell 中 IO a 和 IO (a) 有什么区别?

Haskell 中 IO (a) 和 IO a 有什么区别?

例如:

IO (String)IO String

IO (Int)IO Int

我见过的大多数书籍都将类型放在括号中,然后将其放在 IO 之后,但对我来说,它们是否是同一件事并不明显。

haskell type-theory ghc

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

如何在 PostgreSQL 中定义类型昵称?

我是 SQL 新手,所以如果这个问题很愚蠢,请原谅。

我正在谷歌搜索“如何在 postgresql 中创建类型别名?” 答案似乎都进入了表格类型,以及对于我想做的事情来说太过分的东西。

我需要 PostgreSQL 的版本:

#define t_my_int int
Run Code Online (Sandbox Code Playgroud)

这样做的动机是我的许多表具有相同的字段名称,例如 my_field,并且它们都是 VARCHAR(X) 类型,其中 X 是随机数。我想让我的所有 my_field 都相同。例如,所有 VARCHAR(100)。

我怎么做?

sql postgresql

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

如何在Haskell的IO monad中包装char文字?

我知道您应该将要对结果执行的操作包装在monad中,而不是从monad中拆包。

我找不到如何做到这一点的任何对白痴友好的例子。

例如,我想做这样的事情:

myFunction = do
    c <- getChar
    if (c == 'q')
        then putStrLn "take action 1"
        else putStrLn "take action 2"
Run Code Online (Sandbox Code Playgroud)

但是您不能直接将char文字与IO Char进行比较。

GHCi版本是8.4.4。

错误信息:

[2之1]编译Lib(/Users/jamesstrieter/hask-tink/src/Lib.hs,已解释)

/Users/jamesstrieter/hask-tink/src/Lib.hs:66:18:错误:•无法将预期类型'IO char'与实际类型'Char'匹配•在第二个参数'(==)' ,即“ q”在表达式中:x =='q'在'what2do'的等式中:what2do x = x =='q'•相关绑定包括x :: IO字符(绑定在/ Users / jamesstrieter /hask-tink/src/Lib.hs:66:9)what2do :: IO字符-> Bool(绑定到/Users/jamesstrieter/hask-tink/src/Lib.hs:66:1)| 66 | what2do x = x =='q'| ^^^失败,未加载任何模块。

monads haskell do-notation io-monad

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