如果这个问题很愚蠢,请原谅我。
在阅读 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)
这是一件事吗?
我需要一个实时的事件循环,它执行以下操作:
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值。这是我应该担心的事情吗?如果是,什么是更好的方法?
提前致谢
我是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 的新手,所以如果这个问题很愚蠢,请原谅。
想象一下,我们有两个绑定到名称x和y 的数据结构。
x是可变的。
y不是。
作为一个问题或原则,x是否一定具有与y不同的类型?
我正在阅读《学习 Haskell 时我希望知道什么》,第 72 页上有这样一句话:
\n\n\n第一定律是,当
\nreturn a传递(>>=)给函数时f,该表达式完全等价于f。
所以我正在尝试这样做:
\nreturn 3 >>= (+ 1)\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n我究竟做错了什么?
\n我正在尝试编写一个 Functor 实例:
\nmodule 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\nRun Code Online (Sandbox Code Playgroud)\n我收到此错误:
\nsrc/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 中 IO (a) 和 IO a 有什么区别?
例如:
IO (String)与IO String
IO (Int)与IO Int
我见过的大多数书籍都将类型放在括号中,然后将其放在 IO 之后,但对我来说,它们是否是同一件事并不明显。
我是 SQL 新手,所以如果这个问题很愚蠢,请原谅。
我正在谷歌搜索“如何在 postgresql 中创建类型别名?” 答案似乎都进入了表格类型,以及对于我想做的事情来说太过分的东西。
我需要 PostgreSQL 的版本:
#define t_my_int int
Run Code Online (Sandbox Code Playgroud)
这样做的动机是我的许多表具有相同的字段名称,例如 my_field,并且它们都是 VARCHAR(X) 类型,其中 X 是随机数。我想让我的所有 my_field 都相同。例如,所有 VARCHAR(100)。
我怎么做?
我知道您应该将要对结果执行的操作包装在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'| ^^^失败,未加载任何模块。
haskell ×8
ghc ×4
type-theory ×2
do-notation ×1
functor ×1
immutability ×1
io-monad ×1
monads ×1
mutability ×1
postgresql ×1
sql ×1